當你的操作系統啓動一個可執行文件,它通過一個電話的東西非常喜歡這樣做的:
execv('/usr/bin/ls', 'ls', '-l', '-a', NULL)
注意,參數已經拆分爲三個獨立的話ls
開始前;如果你正在用shell運行你的程序,那麼shell會負責分離;如果您通過一種編程語言來運行它,那麼您可以直接控制調用的參數,然後您就可以決定如何自行拆分數組。
當ls
運行,所以通過這些參數在數組中,argv
。見證通常的方式一個main
函數是以C聲明:
int main(int argc, char *argv[]) {
...
}
它越來越論點的陣列,在常規命名爲argv
變量,已經分解成單個的單詞。
爲ls
解析器,那麼,可以預期,它的運行時,將交由一個數組,看起來像這樣:
argc = 3 # three arguments, including our own name
argv = ['ls', '-l', '-a'] # first argument is our name, others follow
...所以內置ls
命令行解析器不在ls
命令啓動之前,需要分解其參數中的空格 - 空格已經被刪除,並且語法引用被優先和剝離。
現在,當您運行['ls', '-l -a']
時,您明確指定了一個2而不是3的argc和一個包含單個字符串-l -a
的單個參數。要獲得從shell這種行爲,你需要使用引用或轉義:
ls "-l -a"
ls '-l -a'
ls -l\ -a
...你會發現,從外殼調用時ls
失敗的確切方式,你在這裏買到相同與任何這些用法。
您不能運行'LS「在shell -l -a''無論是。嘗試一下。 –