我想知道为什么下面最后打印第一个命令?
file=$(printf .tar.gz & printf test)
echo $file
它输出test.tar.gz
但我期望.tar.gztest
。
答案1
的顺序异步命令不保证,并且取决于 shell 和操作系统调度程序。
一个简单的测试(在 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 上,所有这些 shell 都会生成test.tar.gz
.
答案2
这是因为&
将第一个命令发送到后台,并且printf test
在子 shell 中完成后台命令后,会在子 shell 退出之前显示信息。生产一个test.tar.gz
在调试模式下,您可以看到命令的顺序为
++ printf test
++ printf .tar.gz
+ file=test.tar.gz
+ echo test.tar.gz
希望现在更加清晰了