Bash
“bash script.sh”與“sh script.sh” wrt kill 命令 - 其中 sh 符號連結到 bash
使用命令本身與命令執行bash解釋器有什麼區別, bash的符號連結在哪裡?
bash``sh``sh
我發現的主要區別是,
kill
命令在sh
. 在sh
,kill
command 不接受信號名稱,它只接受信號編號。但是在兩個
sh
vsbash
run 中,kill
command 都是內置的 shell。似乎 bash 如果使用sh
.有沒有關於這種行為的文件?
更多資訊如下:
script.sh
#!/bin/bash some_bg_program() { sleep 10 } some_bg_program& pid=$! kill -SIGTERM $pid
作為
bash script.sh
和執行的輸出sh script.sh
user@machine/tmp$ sh script.sh script.sh: line 8: kill: SIGTERM: invalid signal specification user@machine/tmp$ bash script.sh
(bash script.sh 執行成功,沒有拋出任何錯誤)。
有關
bash
和sh
命令的資訊:user@machine/tmp$ which bash /usr/bin/bash user@machine/tmp$ which sh /usr/bin/sh user@machine/tmp$ ls -l /usr/bin/sh lrwxrwxrwx. 1 root root 4 Aug 4 2020 /usr/bin/sh -> bash # You can see the symlink here user@machine~>ls -l /usr/bin/bash -rwxr-xr-x. 1 root root 964608 Oct 30 2018 /usr/bin/bash user@machine/tmp$ type sh sh is hashed (/usr/bin/sh) user@machine/tmp$ type bash bash is hashed (/usr/bin/bash)
kill
有關bash/sh 中的命令的資訊user@machine/tmp$ cat script.sh #!/bin/bash which kill type kill user@machine/tmp$ sh script.sh /usr/bin/kill kill is a shell builtin sas@172.20.50.161/tmp>bash script.sh /usr/bin/kill kill is a shell builtin
kill
在這兩種情況下,內置的外殼也是如此最後,bash 資訊:
$ bash --version GNU bash, version 4.2.46(2)-release (x86_64-redhat-linux-gnu) $ sh --version GNU bash, version 4.2.46(2)-release (x86_64-redhat-linux-gnu)
謝謝
當
bash
shell 以 name 啟動時sh
,它將自動以 POSIX 模式執行,就好像使用該--posix
選項啟動一樣。手冊的“SEE ALSO”部分
bash
參考http://tiswww.case.edu/~chet/bash/POSIX以了解 shell 的 POSIX 模式的描述。該網頁說,與您使用內置kill
實用程序的問題有關:以下列表是“POSIX 模式”生效時發生的變化:
$$ … $$ 37. ‘kill’ 內置不接受帶有 ‘SIG’ 前綴的信號名稱。
所以是的,
kill
內置實用程序不接受以SIG
POSIX 模式為前綴的信號名稱。您可能希望使用不帶SIG
前綴的信號名稱,即kill -INT "$pid"
或者
kill -s INT "$pid"
這也是該實用程序的 POSIX 規範
kill
所說的應該使用它的方式。請注意,這與發送的預設信號
kill -TERM "$pid"
相同。kill "$pid"``TERM``kill
我不會使用信號編號(
0
信號除外),因為這些編號很難記住,而且除了一個簡短的列表之外,Unices 之間也有所不同。