web-dev-qa-db-ja.com

ネストされたコマンドの保存されたリターンコードで終了すると、DashとBashで異なるリターンコードが返されるのはなぜですか?

ランニング

bash -c 'bash -c "echo test1; exit 1;" &> /tmp/x; buildresult=$?; tail -n 100 /tmp/x; exit $buildresult;'

その結果、test1がコンソールに出力され、echo $?1を出力します。これは、コマンドは内部の[b/d]ash -cが返したものを返す必要があるため、私の理解では正しいです。

dash -c 'dash -c "echo test1; exit 1;" &> /tmp/x; buildresult=$?; tail -n 100 /tmp/x; exit $buildresult;'

結果は同じ出力になりますが、0に従ってecho $?で返されます。

シェルとポータブルシェルプログラミングの理解を深めるために、この違いを理解したいと思います。

Ubuntu 17.10(Artful Aardvark)でbash4.4.12とdash0.5.8-2.3ubuntu1を使用しています。

8
Karl Richter

&>はPOSIXにありません そしてdashではサポートされていません。 & >として解析されるため、代わりにコマンドがバックグラウンドで実行されます。 バックグラウンドコマンドには終了ステータス0が与えられます 親の観点からは、$?を読み取るまでに終了していないためです。

そのため、(少なくとも私にとっては)「test1」出力がプロンプトに表示されますafterコマンドが終了しました。

Bashの&> foo> foo 2>&1 と同等であり、ポータブルスクリプトは後者を使用する必要があります。

20
Michael Homer