Bash
是’cmd1newlinen和在l一世n和newlinecmd2’ 與 Bash 腳本中的 ‘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
根據我的經驗,第一個腳本比第二個腳本(超過 10 分鐘後)更快地創建
nalog
文件(幾秒鐘內),這向我表明後者等待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它是
&
和不是&&
。我知道什麼&&
可以和不想在這裡應用它。
不,
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
作為協同程序執行。