以下の最初のコマンドが最後に印刷される理由を知りたいです。
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
もう少し明確になりたいです。