Shebangはスクリプトが実行されるシェルを決定しますか?

Shebangはスクリプトが実行されるシェルを決定しますか?

愚かな質問かもしれませんが、それでも聞いてみましょう。シェバンを宣言したら

#!/bin/bash 

したがって、常にmy_shell_script.shbashを使用してこのスクリプトを呼び出す必要があります。

[my@comp]$bash my_shell_script.sh

あるいは、例えば使用することができる。

[my@comp]$sh my_shell_script.sh

私のスクリプトは、shebangを使用してどのシェルが実行されているかを確認しますか?シェルでも同じことが起こりますかksh?私はAIXを使用しています。

ベストアンサー1

これシェルボーン #!人間が読めるインスタンスです。マジックナンバー実行するファイルがスクリプトかバイナリファイルであるかを判断するために関数系0x23 0x21で使用されるバイト文字列で構成されています。exec()Shebangが存在する場合、exec()Shebangの後に指定された実行可能ファイルが実行されます。

これは、次のようにコマンドラインでインタプリタを指定してスクリプトを呼び出すことを意味します。両方質問に与えられた状況は、exec()コマンドラインで指定されたインタプリタを実行し、スクリプトを表示しません。

exec()したがって、他の人が指摘したように、shebang行で指定されたインタプリタを呼び出すには、スクリプトが実行可能ビットを設定して次のように呼び出す必要があります./my_shell_script.sh

この動作は、次のスクリプトを使用して簡単に説明できます。

#!/bin/ksh
readlink /proc/$$/exe

説明する:

  • #!/bin/kshksh通訳者として定義されます。

  • $$現在のプロセスのPIDを保存します。

  • /proc/pid/exeプロセス実行可能ファイルへのシンボリックリンクです(少なくともLinuxでは、AIXでは、/proc/$$/object/a.outは実行可能ファイルへのリンクです)。

  • readlinkシンボリックリンクの値を出力します。

例:

ノート:基本シェルが/bin/shシンボリックリンクであるUbuntuでこれを実演しました。スプリントつまり、シンボリックリンク/bin/dashとシンボリックリンクです。/bin/ksh/etc/alternatives/ksh/bin/pdksh

$ chmod +x getshell.sh
$ ./getshell.sh 
/bin/pdksh
$ bash getshell.sh 
/bin/bash
$ sh getshell.sh 
/bin/dash

おすすめ記事