システムは、shebang行なしでスクリプトを実行するシェルをどのように決定しますか? [コピー]

システムは、shebang行なしでスクリプトを実行するシェルをどのように決定しますか? [コピー]

私のArch Linuxシステムには、次の「スクリプト」があります。

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

ps独自のPIDでのみ実行されます。しかし、スクリプトにはshebang行はありません。私は特定のシャバンがなければ、システムが私が実行するために使用したインタラクティブシェルや$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はスクリプトの実行に独自に使用される唯一のシェルのように見え、私がテストした他のすべてのシェルはそれを使用しますsh。これは/bin/shシェルbashか他のシェルかとは関係ありません。また、同じ動作を/bin/sh持つUbuntuシステムでテストしました。 bashは独自にスクリプトを実行し、.bashrcを使用してスクリプトを実行します。dashdashzshsh

上記の私のArchとUbuntuシステムでは、私の変数はにSHELL設定され、/bin/bash私のユーザーエントリは私のデフォルトのシェルに設定され/etc/passwdました。/bin/bash

質問:

  • 誰がこれを制御しますか?カーネルかシェルか?これはbash機能ですか(つまり、bashはshebangなしでそれ自体で使用されます)?他にはありませんか?
  • 貝殻はなぜ異なって行動するのですか?私の出力はなぜこのようにさまざまな形式で出てきますかpssh /home/terdon/scripts/foo.sh、孤独sh、そして/bin/sh /home/terdon/scripts/foo.sh。ここで何が起こっているのでしょうか?私はこれらすべてが同じであることを知っていますが、同じ基本的な作業を始める方法が多すぎるということは驚くべきことです。

関連情報