在 Bash 脚本中,“cmd1 [newline] cmd2”是否与“cmd1 & cmd2”一样并发?

在 Bash 脚本中,“cmd1 [newline] cmd2”是否与“cmd1 & cmd2”一样并发?

执行以下脚本

#!/usr/bin/bash

while true
do
  ab -c 700 -n 100000000000 -r http://crimea-post.ru/ >>crimea-post & ab -c 700 -n 100000000000 -r http://nalog.gov.ru/ >>nalog
done

做的完全一样

#!/usr/bin/bash

while true
do
  ab -c 700 -n 100000000000 -r http://crimea-post.ru/ >>crimea-post 
  ab -c 700 -n 100000000000 -r http://nalog.gov.ru/ >>nalog
done

根据我的经验,第一个脚本nalog比第二个脚本(10 多分钟后)更快地创建文件(几秒钟内),这表明后者需要等待ab -c 700 -n 100000000000 -r http://nalog.gov.ru/ >>nalog完成。事实不应该是这样,因为从到目前为止我所研究的第二个脚本旨在启动ab -c 700 -n 100000000000 -r http://nalog.gov.ru/ >>nalog而不等待ab -c 700 -n 100000000000 -r http://crimea-post.ru/ >>crimea-post完成。我希望这两个ab命令同时执行,我如何在 Bash 中实现这一点?

PS 是&又不是&&。我知道什么&&是不想在这里应用它。

答案1

不,cmd1 [newline] cmd2不像前者那样并发cmd1 & cmd2——前者cmd1在开始之前等待完成cmd2

如果您希望在第一个命令运行时继续执行,则需要&在将其分为两行时保留:

ab -c 700 -n 100000000000 -r http://crimea-post.ru/ >>crimea-post & ab -c 700 -n 100000000000 -r http://nalog.gov.ru/ >>nalog

变成

ab -c 700 -n 100000000000 -r http://crimea-post.ru/ >>crimea-post &
ab -c 700 -n 100000000000 -r http://nalog.gov.ru/ >>nalog

如果您想确保两个命令在再次循环之前完成,您可以使用wait.

其他 shell 构造也提供并发性,特别是管道:(a | b或其在某些 shell 中的变体,a |& b用于重定向两个输出流)运行ab并等待两者完成后再继续。一些 shell 还支持协进程(请参阅如何在各种 shell 中使用 coproc 命令?)和过程替代(参见如何在各种 shell 中使用 coproc 命令?)可用于同时运行命令。

shell 的控制和重定向运算符是什么?有关列表终止符(包括&)和管道运算符的详细信息。


¹ 除了在 ksh 中,它a作为协进程运行。

相关内容