入れ子になったコマンドで保存された戻りコードを使用して終了すると、DashとBashで異なる戻りコードが発生するのはなぜですか?

入れ子になったコマンドで保存された戻りコードを使用して終了すると、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と0.5.8-2.3ubuntu1を使用しています。dash

ベストアンサー1

&>POSIXにはリダイレクトはありません。の影響を受けませんdash。解析さ& >れるので、コマンドは代わりにバックグラウンドで実行されます。バックグラウンドコマンドの終了ステータスは0です。親の観点から見ると、あなたが読んでも辞めなかったからです$?

これが(少なくとも私にとっては)test1プロンプトに出力が表示される理由です。後ろにコマンドが完了しました。

バッシュに&> foo相当する> foo 2>&1、移植可能なスクリプトは後者を使用する必要があります。

おすすめ記事