2013-09-27 67 views

回答

0

從手冊頁:

-c string如果有-c選項,那麼命令將從string中讀取。如果字符串後面有參數,則將它們分配給位置參數,從$ 0開始。

只要cmd將通過bash(或任何默認)外殼運行。您需要sh來顯式調用-c參數。

exec在這裏不應該有所作爲。

2

這取決於'cmd'代表什麼。在基本情況下,它是一個簡單的命令名稱(如psls),那麼在shell命令行上沒有區別,而在由execvp()執行時幾乎沒有什麼區別。 'non-p'exec*()函數確實有稍微不同的語義;他們不使用PATH變量,所以命令必須存在並且可以在當前目錄中執行,否則將失敗。

但是,如果cmd更復雜,那麼它可以產生很大的差異。例如:

$ echo $$ 
17429 
$ sh -c 'echo $$' 
76322 
$ sh -c "echo $$" 
17429 
$ 

第一次報告原始shell的進程ID;第二個報告shell運行的進程ID爲sh;第三是報告原始shell的進程ID的昂貴方式。請注意,單引號與雙引號也很重要。在這裏,行情不會出現在C調用(殼去除參數周圍的引號),並$$值將是子殼:

char *argv[] = { "sh", "-c", "echo $$", 0 }; 
execvp(argv[0], argv); 

(我說的是報價是不存在於C調用中;它們需要圍繞C代碼中的字符串,但傳遞給sh的值不包含任何引號 - 所以我的意思是我所說的,儘管它可能不像所有那樣明顯)

+0

另一個例子是'cd' vs'sh -c cd'。第一個將當前目錄改變爲home,而第二個則不做任何事情。 – tom

+0

@tom:實際上,增加了複雜性,因爲根本沒有執行'exec *()'函數的'cd'二進制文件。類似的註釋適用於其他shell內置函數 - 'exit','jobs',... –