コマンド置換 (Bash/Dash) の誤ったコマンドシーケンス

コマンド置換 (Bash/Dash) の誤ったコマンドシーケンス

以下の例のように置換コマンドを実行すると実行順序が壊れるのはなぜですか?まずchmodコマンドを実行してecho 1からecho 2

echo $(echo 1; echo 2; chmod 444 nonexistent_file)

結果:

chmod: Cannot access 'nonexistent_file': No such file or directory
1 2

答え1

実行順序が壊れておらず、出力順序が期待したものとは異なります。

echo 1実行し、echo 2出力を標準出力に書き込みます。シェルはコマンド置換のためにそれを蓄積します。その後、chmodエラーメッセージを発行し、標準エラーとして印刷します。標準エラーは端末に直接移動するため、エラーが最初に来ます。最後に、外部echo実行命令は結果「1 2 」を置き換える。

関連情報