printfオーダー?

printfオーダー?

以下の最初のコマンドが最後に印刷される理由を知りたいです。

file=$(printf .tar.gz & printf test)
echo $file

test.tar.gz期待どおりに出力されます.tar.gztest

答え1

注文する非同期コマンド保証されておらず、シェルとオペレーティングシステムのスケジューラによって異なります。

簡単なテスト(Mac OSX El Capitalで実行zsh):

for shell in bash ksh zsh mksh yash dash; do
  printf '[%s]\n' "$shell"
  "$shell" -c 'file=$(printf .tar.gz & printf test); echo "$file"'
done
[bash]
test.tar.gz
[ksh]
test.tar.gz
[zsh]
.tar.gztest
[mksh]
.tar.gztest
[yash]
test.tar.gz
[dash]
test.tar.gz

私のUbuntu 14.04 VMでは、これらのすべてのシェルが作成されますtest.tar.gz

答え2

&これは、最初のコマンドがバックグラウンドで送信され、サブシェルでバックグラウンドコマンドがprintf test完了した後にサブシェルが終了する前にメッセージが表示されるためです。一つを作り出すtest.tar.gz

デバッグモードでは、コマンドの順序が次のように表示されます。

++ printf test
++ printf .tar.gz
+ file=test.tar.gz
+ echo test.tar.gz

もう少し明確になりたいです。

関連情報