我的 Arch Linux 系统上有这个“脚本”:
$ cat ~/scripts/foo.sh
ps -hp $$
它只会ps
在自己的 PID 上运行。但剧本里没有shebang台词。我期望在没有特定的 shebang 的情况下,系统将使用我用来启动它的任何交互式 shell 来运行它,或者使用我设置为$SHELL
.但是,我发现它确实根据我运行的 shell 发生变化,但并不一致:
如果我从 bash 会话启动它,它将由 bash 运行:
$ ps -hp $$ 1267979 pts/15 Ss 0:00 /bin/bash $ foo.sh 1276346 pts/15 00:00:00 bash
如果我从 zsh 会话启动它,它的运行方式是
sh
(bash
在我的系统上):% ps -hp $$ 1279855 pts/15 S 0:00 zsh % foo.sh 1280006 pts/15 S+ 0:00 sh /home/terdon/scripts/foo.sh
如果我从会话启动它
sh
,它会再次运行sh
:$ ps -hp $$ 1281052 pts/15 S 0:00 sh $ foo.sh 1281296 pts/15 S+ 0:00 sh
如果我从会话启动它
tcsh
,它会再次运行sh
:> ps -hp $$ 1281968 pts/15 S 0:00 -csh > foo.sh 1282148 pts/15 S+ 0:00 /bin/sh /home/terdon/scripts/foo.sh
如果我从会话中启动它,它会再次
dash
运行sh
$ ps -hp $$ 1282803 pts/15 S 0:00 dash $ foo.sh 1283404 pts/15 S+ 0:00 /bin/sh /home/terdon/scripts/foo.sh
因此,当脚本从 bash 会话启动时,bash 看起来是唯一会使用自身运行脚本的 shell,而我测试的所有其他 shell 都会使用它sh
。这与是否/bin/sh
是 shellbash
或其他 shell无关。我还在 Ubuntu 系统上进行了测试,该系统/bin/sh
具有dash
相同的行为:bash 将使用自身运行脚本,dash
并zsh
使用 .bashrc 运行脚本sh
。
在我的 Arch 和上面提到的 Ubuntu 系统上,我的SHELL
变量设置为/bin/bash
,并且我的用户条目/etc/passwd
已/bin/bash
作为我的默认 shell。
问题:
- 谁控制这个?是内核还是外壳?这是 bash 功能吗(即 bash 将在没有 shebang 的情况下使用自身)?还有别的事吗?
- 为什么贝壳的行为不同?为什么我的输出有这么多不同的格式
ps
?我看到sh /home/terdon/scripts/foo.sh
,sh
孤独,和/bin/sh /home/terdon/scripts/foo.sh
。这里发生了什么?我意识到这些都是等效的,但令人惊讶的是看到有这么多不同的方式来启动相同的基本工作。