“bash script.sh”与“sh script.sh”wrt Kill 命令 - 其中 sh 符号链接到 bash

“bash script.sh”与“sh script.sh”wrt Kill 命令 - 其中 sh 符号链接到 bash

运行有什么区别巴什使用bash命令本身与sh命令的解释器,哪里sh还有 bash 的符号链接?

我发现的主要区别是,kill命令在sh.在 中shkill命令不接受信号名称,它只接受信号编号。

但在shvs bashrun 中,kill命令都是 shell 内置命令。如果使用 调用,bash 的行为似乎有所不同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

[email protected]/tmp>bash script.sh
/usr/bin/kill
kill is a shell builtin

kill两种情况下都是内置的 shell

最后是 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)

谢谢

答案1

bashshell 使用 name 启动时sh,它将自动以 POSIX 模式运行,就像使用该--posix选项启动一样。

本手册的“另请参阅”部分bash指的是http://tiswww.case.edu/~chet/bash/POSIX有关 shell 的 POSIX 模式的描述。该网页显示,与您使用内置kill实用程序的问题有关:

以下列表是“POSIX 模式”生效时发生的变化:

[...]

  1. 'kill' 内置函数不接受带有 'SIG' 前缀的信号名称。

所以是的,kill内置实用程序不接受SIGPOSIX 模式中前缀为 的信号名称。您可能想使用不带前缀的信号名称SIG,即

kill -INT "$pid"

或者

kill -s INT "$pid"

这也是如何kill该实用程序的 POSIX 规范说应该使用它。

请注意,该信号与发送的默认信号kill -TERM "$pid"相同。kill "$pid"TERMkill

我不会使用信号编号(信号除外0),因为这些编号很难记住,而且除了简短的列表外,Unices 之间的编号也有所不同。

相关内容