當從shell commnad行執行並且分別從c exec()函數執行時,「sh -c cmd」和「cmd」有什麼區別?謝謝。「sh -c cmd」和「cmd」之間的區別?
0
A
回答
0
從手冊頁:
-c string如果有-c選項,那麼命令將從string中讀取。如果字符串後面有參數,則將它們分配給位置參數,從$ 0開始。
只要cmd
將通過bash(或任何默認)外殼運行。您需要sh來顯式調用-c參數。
exec在這裏不應該有所作爲。
2
這取決於'cmd
'代表什麼。在基本情況下,它是一個簡單的命令名稱(如ps
或ls
),那麼在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
的值不包含任何引號 - 所以我的意思是我所說的,儘管它可能不像所有那樣明顯)
相關問題
- 1. #!/ bin/sh和#之間的區別:/ bin/sh
- 2. 從netbeans和cmd運行Java之間的區別
- 3. Unix/cmd腳本和python腳本之間的區別
- 4. UNIX中「./」和「sh」之間的區別
- 5. bash腳本中的'exec cmd&'和'cmd&'有什麼區別?
- 6. 當從cmd運行控制檯和winforms應用程序之間的區別
- 7. cmd文件中%和%%有什麼區別?
- 8. * .bat和* .cmd文件有什麼區別?
- 9. 網絡用戶管理員密碼在運行.bat和cmd之間的區別?
- 10. cmd到C++的間隙
- 11. 區分bash/shell和cmd
- 12. C#「var」和C++「auto」之間的區別
- 13. C和C++之間的區別
- 14. Java和C#和.NET之間的區別
- 15. C++程序和cmd控制檯之間的管道
- 16. C#CMD平時間戳
- 17. root shell「#」和「sh-4.2#」之間的Linux區別
- 18. 的ProcessBuilder和CMD
- 19. `%in%`和`==`之間的區別
- 20. CMD:從CMD
- 21. C中的/ +和+之間的區別?
- 22. ==和case之間的區別?
- 23. fmod和%之間的區別
- 24. c /#和#region之間的區別#
- 25. C#中char和int之間的區別#
- 26. C#中Convert.ToString()和.ToString()之間的區別?
- 27. [abc]和(a | b | c)之間的區別
- 28. Ruby和C之間的主要區別
- 29. VS DataBreakpoints:C和C++之間的區別
- 30. objective-c @「hello」和「hello」之間的區別?
另一個例子是'cd' vs'sh -c cd'。第一個將當前目錄改變爲home,而第二個則不做任何事情。 – tom
@tom:實際上,增加了複雜性,因爲根本沒有執行'exec *()'函數的'cd'二進制文件。類似的註釋適用於其他shell內置函數 - 'exit','jobs',... –