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


8

ランニング

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 を使用しています。

回答:


20

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

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

Bashはと&> foo同等> foo 2>&1であり、移植可能なスクリプトでは後者を使用する必要があります。


5
&>POSIXです。それはだ&が続きます>。ではfoo &> bar、それはバックグラウンドでfoo &開始foo> bar、コマンドなしでリダイレクトを実行することです。bash解釈が異なる場合、POSIXに準拠していません。
ステファンChazelas

4
興味深いのは、これがwiki.ubuntu.com/DashAsBinShで言及されていなかったことです。 私は自由にページを編集してそれを含めました
Sergiy Kolodyazhnyy 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.