bash myscript.sh は bash で実行されますが、最初の行は #!/usr/bin/sh です。

bash myscript.sh は bash で実行されますが、最初の行は #!/usr/bin/sh です。

次のようなスクリプトがあります。

#!/usr/bin/sh

var="ABC"
if [ $var == "ABC" ]
then
   echo True
else
   echo False
fi

上記のコードは、Solaris SparcおよびSolaris X64では機能しません。未定義としてマークされます====上記のコードは=

奇妙なことは、上記のコードを変更せずに次のメソッドで実行すると機能することです。

#bash test.sh

私が理解したのは、私が使用しているスクリプトの上部が比較演算子をサポートしてい#!/bin/shないため、このスクリプトはbashでも機能しないはずです。==

上記のスクリプトを実行すると、なぜ実際に機能するのかを説明できる人はいますか?

注:私はbash==がと=

ベストアンサー1

スクリプトの最初の行を行#!(時々「シェボン」ワイヤー)。

次のようにスクリプトを直接実行する場合にのみ使用してください。

./test.sh

説明する

実行可能ファイルを実行すると、オペレーティングシステムは最初の2バイトを表示してプログラムの種類を決定します。

走るとき

./test.sh

オペレーティングシステムが見る最初の2バイト./test.sh#!、プログラムがスクリプトであることがわかります。

スクリプトの実行に使用する必要があるシェル1を確認するために、残りの行を読みます。この場合、行の残りの部分があるため、2が/usr/bin/sh実行されます。/usr/bin/sh test.sh

走るとき

bash test.sh

/usr/bin/bash3でbashを見つけます見つかった最初の2バイト/usr/bin/bashはnotなので、#!最初/usr/bin/bash test.shの行も表示せずに実行されます。test.sh.

どちらの場合も、Shebang行はsh実際にbash無視されます。で始まる行は#コメントであるからです。このような魔法を実行する唯一のことは、#シェルではなくオペレーティングシステムです。

追加情報:

脚注:

  1. 実際、これは必ずしもシェルである必要はありませんが、どのプログラムでも構いません。
  2. 実際にはもっと似ていますexecl("./test.sh", "/usr/bin/sh", "./test.sh", NULL)
  3. /bin/shほとんどのLinuxシステムでは、問題はSolarisに関するものです。

おすすめ記事