![在 Bash 脚本中,“cmd1 [newline] cmd2”是否与“cmd1 & cmd2”一样并发?](https://linux22.com/image/202988/%E5%9C%A8%20Bash%20%E8%84%9A%E6%9C%AC%E4%B8%AD%EF%BC%8C%E2%80%9Ccmd1%20%5Bnewline%5D%20cmd2%E2%80%9D%E6%98%AF%E5%90%A6%E4%B8%8E%E2%80%9Ccmd1%20%26%20cmd2%E2%80%9D%E4%B8%80%E6%A0%B7%E5%B9%B6%E5%8F%91%EF%BC%9F.png)
执行以下脚本
#!/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
用于重定向两个输出流)运行a
和b
并等待两者完成后再继续。一些 shell 还支持协进程(请参阅如何在各种 shell 中使用 coproc 命令?)和过程替代(参见如何在各种 shell 中使用 coproc 命令?)可用于同时运行命令。
看shell 的控制和重定向运算符是什么?有关列表终止符(包括&
)和管道运算符的详细信息。
¹ 除了在 ksh 中,它a
作为协进程运行。