ランニング
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)でbash
4.4.12とdash
0.5.8-2.3ubuntu1を使用しています。
&>
はPOSIXにありません そしてdash
ではサポートされていません。 & >
として解析されるため、代わりにコマンドがバックグラウンドで実行されます。 バックグラウンドコマンドには終了ステータス0が与えられます 親の観点からは、$?を読み取るまでに終了していないためです。
そのため、(少なくとも私にとっては)「test1
」出力がプロンプトに表示されますafterコマンドが終了しました。
Bashの&> foo
は> foo 2>&1
と同等であり、ポータブルスクリプトは後者を使用する必要があります。