當boot從終端讀取一行輸入後,該怎麼解釋執行呢,怎麼判斷一條命令什麼時候結束,使用者輸入的是一條命令還是多條命令?
下面是boot中的部分重要**片段:
int boot_docommands(char *buf)
while ((cmd = (ui_command_t *) q_deqnext(&(cmdqueue)))) <%s>\n", cmd->ptr);
status = ui_docommand(cmd->ptr);
term = cmd->term;
kfree(cmd);
if (status == cmd_err_blank) continue;
/* * and causes us to stop at the first failure.
*/if ((term == cmd_term_and) && (status != 0)) break;
/* * or causes us to stop at the first success.
*/if ((term == cmd_term_or) && (status == 0)) break;
/* * neither and nor or causes us to keep chugging away.
*/} return status;
}ui_command_t *cmd_readcommand(char **pptr)
if ((*ptr == '&') && (*(ptr+1) == '&'))
if ((*ptr == '|') && (*(ptr+1) == '|'))
}if (*ptr == '\'')
if (!insquote)
}if (!insquote && (*ptr == '\\'))
ptr++;
} ptr += termlen;
cmd = (ui_command_t *) kmalloc((sizeof(ui_cmdline_t) + (ptr-*pptr) - termlen + 1),0);
memcpy((char *)(cmd+1),*pptr,ptr-*pptr-termlen);
cmd->ptr= (char *) (cmd+1);
cmd->term = term;
cmd->ptr[ptr-*pptr-termlen] = 0;
*pptr = ptr;
return cmd;
}
insquote表示處在單引號中,indquote表示處在雙引號中
1. 首先考慮沒有單引號和雙引號的情況:
碰到下列字元表示一條命令的結束:
碰到轉義字元'\',則直接跳過轉義符後面的字元。
2. 只有單引號的情況:
單引號不能巢狀,因為單引號左邊跟右邊是同乙個字元,因此巢狀深度不知道是該加一還是減一。單引號中可以包含任何字元,包括雙引號,反斜槓\,但任何字元都看做普通字元,直到碰到下乙個單引號(跟在轉義字元之後的單引號也算),單引號才算結束。
3. 只有雙引號的情況:
雙引號也不能巢狀,原因跟單引號一樣,左右部分相同。雙引號中支援轉義字元,因此碰到\" 雙引號不算結束。
4. 單引號中包含雙引號:
這種情況較簡單,因為單引號中的都看做普通字元
5. 雙引號中包含單引號:
雙引號中可以包含單引號,碰到單引號後當做特殊字元來處理,直到碰到下乙個單引號結束,其他情況跟只有雙引號一樣。
另外注意組合命令的處理,&& 只有當前面一條命令執行成功才執行後面的命令, ||表示前面的命令執行失敗了才執行後面的命令。
jq 命令列 JSON 解析器 命令大全
jq 命令列json處理器 1.6版 jq commandline json processor version 1.6 usage jq options file.jq options args strings.jq options jsonargs json texts.jq是用於處理json輸...
命令列解析
不想自已分析命令列的話也可以 lpwstr lpwargv lpwargv commandlinetoargvw getcommandlinew dwcount dwcount的值即為命令列引數的個數 像控制台程式一樣,引數也包括本執行檔案的全路徑 lpwargv為乙個lpwstr 的指標,需要按如...
Linux shell 命令解析器
都說shell是基本功,打好地基才能建立上層建築。覺得自己對shell的掌握還不夠,希望能經過積累對其越發熟悉,可以良好的運用。shell 命令解析器 將使用者輸入的指令轉化為機器可以執行的程式。開頭要寫 bin bash sh 用bash sh解析 在shell指令碼中 後面加注釋。檔案存為fil...