次のようなスクリプトがあります。
#!/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/bash
3でbashを見つけます。見つかった最初の2バイト/usr/bin/bash
はnotなので、#!
最初/usr/bin/bash test.sh
の行も表示せずに実行されます。test.sh.
どちらの場合も、Shebang行はsh
実際にbash
無視されます。で始まる行は#
コメントであるからです。このような魔法を実行する唯一のことは、#
シェルではなくオペレーティングシステムです。
追加情報:
脚注:
- 実際、これは必ずしもシェルである必要はありませんが、どのプログラムでも構いません。
- 実際にはもっと似ています
execl("./test.sh", "/usr/bin/sh", "./test.sh", NULL)
。 /bin/sh
ほとんどのLinuxシステムでは、問題はSolarisに関するものです。