Bash

“bash script.sh”與“sh script.sh” wrt kill 命令 - 其中 sh 符號連結到 bash

  • April 7, 2021

使用命令本身與命令執行bash解釋器有什麼區別, bash的符號連結在哪裡?bash``sh``sh

我發現的主要區別是,kill命令在sh. 在sh, killcommand 不接受信號名稱,它只接受信號編號。

但是在兩個shvs bashrun 中,killcommand 都是內置的 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 執行成功,沒有拋出任何錯誤)。

有關bashsh命令的資訊:

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)

謝謝

bashshell 以 name 啟動時sh,它將自動以 POSIX 模式執行,就好像使用該--posix選項啟動一樣。

手冊的“SEE ALSO”部分bash參考http://tiswww.case.edu/~chet/bash/POSIX以了解 shell 的 POSIX 模式的描述。該網頁說,與您使用內置kill實用程序的問題有關:

以下列表是“POSIX 模式”生效時發生的變化:

$$ … $$ 37. ‘kill’ 內置不接受帶有 ‘SIG’ 前綴的信號名稱。

所以是的,kill內置實用程序不接受以SIGPOSIX 模式為前綴的信號名稱。您可能希望使用不帶SIG前綴的信號名稱,即

kill -INT "$pid"

或者

kill -s INT "$pid"

這也是該實用程序的 POSIX 規範kill所說的應該使用它的方式。

請注意,這與發送的預設信號kill -TERM "$pid"相同。kill "$pid"``TERM``kill

我不會使用信號編號(0信號除外),因為這些編號很難記住,而且除了一個簡短的列表之外,Unices 之間也有所不同。

引用自:https://unix.stackexchange.com/questions/643884