运行有什么区别巴什使用bash
命令本身与sh
命令的解释器,哪里sh
还有 bash 的符号链接?
我发现的主要区别是,kill
命令在sh
.在 中sh
,kill
命令不接受信号名称,它只接受信号编号。
但在sh
vs bash
run 中,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
当bash
shell 使用 name 启动时sh
,它将自动以 POSIX 模式运行,就像使用该--posix
选项启动一样。
本手册的“另请参阅”部分bash
指的是http://tiswww.case.edu/~chet/bash/POSIX有关 shell 的 POSIX 模式的描述。该网页显示,与您使用内置kill
实用程序的问题有关:
以下列表是“POSIX 模式”生效时发生的变化:
[...]
- 'kill' 内置函数不接受带有 'SIG' 前缀的信号名称。
所以是的,kill
内置实用程序不接受SIG
POSIX 模式中前缀为 的信号名称。您可能想使用不带前缀的信号名称SIG
,即
kill -INT "$pid"
或者
kill -s INT "$pid"
这也是如何kill
该实用程序的 POSIX 规范说应该使用它。
请注意,该信号与发送的默认信号kill -TERM "$pid"
相同。kill "$pid"
TERM
kill
我不会使用信号编号(信号除外0
),因为这些编号很难记住,而且除了简短的列表外,Unices 之间的编号也有所不同。