「invoked as」は、Bashを起動するプロセスが「ゼロ番目」のコマンドライン引数に入れるものを指しますargv[0]。
プログラムがexec*()syscallsで開始されると、プログラムを含むバイナリファイルの名前を実際に知ることはありませんが、代わりに呼び出しプロセスは自由に必要なものを自由に配置できます。通常、名前はファイルシステムから取得されます。したがって、を実行すると/bin/sh、そこに配置されます。/bin/shBashの場合、シンボリックリンクである必要はありません。ハードリンクまたはシェルプログラムの別のコピーである可能性があります。
「プログラム名」を設定する例として、Bashのexecコマンドは-aオプションで0番目の引数を設定できます。(Perlでも同じことができますが、直接Cなどでもできます。)
これmynameは、ゼロ番目の引数、つまり自分自身に見える名前を出力する単純なCプログラムです。
$ ./myname
I am ./myname
$ (exec -a something ./myname )
I am something
$ mv ./myname somename
$ ln -s somename othername
$ ./somename
I am ./somename
$ ./othername
I am ./othername
ソース:
#include <stdio.h>
int main(int argc, char *argv[]) {
printf("I am %s\n", argv[0]);
return 0;
}
しかし、番号の付いた質問に答えるために...
(1&4)を実行するには、sh somescript何でも実行されますsh、あなたの上にありPATH、おそらく/bin/shしかし、のような、おそらく何か/usr/xpg4/bin/sh。
- Bashの場合、名前が表示されるため、POSIXモードで実行されます
sh。
- ZシェルまたはKornシェルの場合、同様に名前
shが表示されますが、Bourneシェル互換であることを目的とした「SH互換」モードで実行され、両方のシェルの完全なPOSIX準拠モードとは微妙に異なります。
- もちろん、Almquistシェル、実際のBourneシェル、または他の何かです。
(2&5)Running bash somescriptは通常のBashモードで実行されます(これももちろんbash、自分の状態によって異なりますPATH)。
(3)ここで、スクリプトの名前は、プログラムファイルの代わりにシステムコールに直接与えられます。カーネルはhashbang行を読み取り、それを使用してスクリプトを実行します。
(6)これは複雑なものです。(3)に似ていますが、プログラムを開始するためのシステムコールは失敗します(ENOEXEC (Exec format error))。これは、hashbang行がないためです。次に何が起こるかは、実行しているシェル自体がPOSIXモードであるかどうかによって異なります。POSIXでは、POSIX準拠のシェルがに応じて特定の方法で動作する必要がありENOEXECます。 ただし、「シェルを起動するのと同等のコマンド」には多少の余裕があります。つまり、シェルが異なれば異なることを行います。
- Bourne Againシェルは、最初のコマンドライン引数としてスクリプトの名前を使用して、同じモードで自分自身を再実行します。POSIX準拠モードでは、もちろんPOSIX準拠モードで自身を実行するため、POSIX準拠のシェルを呼び出すというPOSIX要件に従います。
- Zシェル、Almquistシェル、Kornシェル
/bin/shは、最初のコマンドライン引数として、他の引数の前に挿入されたスクリプトの名前で実行されます。Zシェル、Almquistシェル、およびKornシェルは、/bin/shプログラムが1 であると仮定することにより、POSIX準拠のシェルを呼び出す(試行する)ことです。