系统如何决定哪个 shell 运行没有 shebang 行的脚本?

系统如何决定哪个 shell 运行没有 shebang 行的脚本?

我的 Arch Linux 系统上有这个“脚本”:

$ cat ~/scripts/foo.sh
ps -hp $$

它只会ps在自己的 PID 上运行。但剧本里没有shebang台词。我期望在没有特定的 shebang 的情况下,系统将使用我用来启动它的任何交互式 shell 来运行它,或者使用我设置为$SHELL.但是,我发现它确实根据我运行的 shell 发生变化,但并不一致:

  1. 如果我从 bash 会话启动它,它将由 bash 运行:

    $ ps -hp $$ 
    1267979 pts/15   Ss     0:00 /bin/bash
    $ foo.sh
    1276346 pts/15   00:00:00 bash
    
  2. 如果我从 zsh 会话启动它,它的运行方式是shbash在我的系统上):

    % ps -hp $$ 
    1279855 pts/15   S      0:00 zsh
    % foo.sh
    1280006 pts/15   S+     0:00 sh /home/terdon/scripts/foo.sh
    
  3. 如果我从会话启动它sh,它会再次运行sh

    $ ps -hp $$
    1281052 pts/15   S      0:00 sh
    $ foo.sh
    1281296 pts/15   S+     0:00 sh
    
  4. 如果我从会话启动它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
    
  5. 如果我从会话中启动它,它会再次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 将使用自身运行脚本,dashzsh使用 .bashrc 运行脚本sh

在我的 Arch 和上面提到的 Ubuntu 系统上,我的SHELL变量设置为/bin/bash,并且我的用户条目/etc/passwd/bin/bash作为我的默认 shell。

问题:

  • 谁控制这个?是内核还是外壳?这是 bash 功能吗(即 bash 将在没有 shebang 的情况下使用自身)?还有别的事吗?
  • 为什么贝壳的行为不同?为什么我的输出有这么多不同的格式ps?我看到sh /home/terdon/scripts/foo.shsh孤独,和/bin/sh /home/terdon/scripts/foo.sh。这里发生了什么?我意识到这些都是等效的,但令人惊讶的是看到有这么多不同的方式来启动相同的基本工作。

相关内容