我剛剛編寫了一個shell腳本來控制模塊的啓動和停止。一切似乎都很正常,直到我發現停止命令導致出乎意料的結果。我使用命令kill -s SIGKILL -- -gpid
來終止一組進程。我用的是/bin/sh
運行這樣linux shell kill signal SIGKILL && KILL
/bin/sh -c "kill -s SIGKILL -- -gpid"
其回答錯誤
/bin/sh: line 0: kill: SIGKILL: invalid signal specification
然後,我/bin/bash
取代/bin/sh
的命令,因此命令是
/bin/bash -c "kill -s SIGKILL -- -gpid"
該回答什麼錯誤。所以我總結了bash和sh之間的差異導致結果的解釋。但是,當我ls
的/bin/sh
,我發現/bin/sh
是/bin/bash
的符號鏈接,所以命令應該是相同的。
我發現命令語法kill -s SIGKILL
不在推薦的語法中,推薦使用kill -s KILL
。
所以我取代了SIGKILL與KILL,命令
/bin/sh -c "kill -s KILL -- -gpid"
這回答沒什麼錯誤。如上所述,任何人都可以解釋這種情況。
什麼是您的發行?在我的Ubuntu 12.04上,'/ bin/sh'實際上指向'/ bin/dash'。難道在你的身上它也是'破折號'而你閱讀'bash'? – Shahbaz 2013-05-07 16:16:27
當'bash'被調用爲'sh'時(例如通過符號鏈接,就像你的情況那樣),它使用sh兼容模式關閉大多數現代功能。我敢打賭'sh'正在調用'kill'的外部二進制文件,它不能識別'SIGKILL',但'bash'調用正在使用它的內建函數,而內建函數卻是。 – Kevin 2013-05-07 16:23:03
@Kevin,bash是否通過檢查它的'argv [0]'來做到這一點? – Shahbaz 2013-05-07 16:33:10