私はSolarisシステムでbash
呼び出されるスクリプトを持っています。/bin/sh
スクリプトを実行すると/bin/sh ./solarisSh
機能します。同じスクリプトを取得すると失敗します。
bash
Bourne Shellとほとんど似ていないことを知っています。これは私の問題ではありません。
私の質問は:/bin/sh
ファイルをインポートするときと単に実行するときにSolarisがなぜそれほど違うのですか?
ここにデータがあります...
ns2 ~/tmp 560> env -i /bin/sh -x
$ uname -a
+ uname -a
SunOS ns2 5.7 Generic_106541-15 sun4m sparc SUNW,SPARCstation-10
$ cat ./solarisSh
+ cat ./solarisSh
[ ! "$BASH" ] && {
>&2 echo "ERROR: $0 is a Bash script. Exiting."
return 1 2> /dev/null || exit 1
}
haveRootPriv() {
local idCmd=/usr/bin/id
local euid
local uid
[[ $OHM_OS == "SunOS" ]] && idCmd=/usr/xpg4/bin/id
if (( ( $( $idCmd -ru) == 0 ) || ( $( $idCmd -u) == 0 ) )); then
echo 1
return 0
fi
echo 0
return 1
}
$ /bin/sh -x ./solarisSh
+ /bin/sh -x ./solarisSh
+ [ ! ]
+ echo ERROR: ./solarisSh is a Bash script. Exiting.
ERROR: ./solarisSh is a Bash script. Exiting.
+ return 1
$ . ./solarisSh
+ . ./solarisSh
syntax error: `$' unexpected
$
これエラー: ./solarisSh は Bash スクリプトです。やめる。ファイルを受け取るときに私が期待するものは次のとおりです。私が得るものは構文エラー: "$" 予期しない。
質問を確認するには:ファイルを検索するときと単に実行するときにSolaris / bin / shがなぜそれほど違うのですか?
2番目の質問があるようです(申し訳ありません):-x
ファイルをインポートするときになぜ機能しないのですか?
ありがとうございます。
- エリック
答え1
$(...)
コマンド置換を削除すると、5.10 での失敗が削除されました。これは.
、実行前にファイル全体を解析し、サポートされていない構文でエラーが発生する効果を見ていることを示します。一方、スクリプトは1行ずつ解析されるため、構文エラーが検出される前に終了します。
実験では、異なる構文エラーを挿入し、同じ動作を見ることができます。.
つまり、早く失敗し、sh
間違った行で実行されます。
なぜ?わかりません。私が見つけることができるどこにも具体的に文書化されていないようです。マニュアルページには次のように表示されます.
。
. filename Read and execute commands from filename and return. The search path specified by PATH is used to find the direc- tory containing filename.
ドキュメントには<<word
「シェル入力を...と読みます」と記載されています。これはおそらく簡潔な解析を意味しますが、これについて明示的な内容はどこにも見られません。一般に、Bashが両方の場合と同様に、シェルスクリプトでは行ごとの解析が非常に一般的です。
ファイルをインポートするときに-xが機能しないのはなぜですか?
コマンドが実際に実行を開始すると動作します。解析ステップでは何も印刷されません。
この特定の例では、` ... `
-styleコマンド置換を使用すると機能しますが、実際のスクリプトはより複雑になる可能性があります。