printf 的顺序?

printf 的顺序?

我想知道为什么下面最后打印第一个命令?

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

希望现在更加清晰了

相关内容