從bash腳本運行命令時,bash總是等待上一個命令完成,還是隻是啓動命令,然後繼續下一個命令?bash命令是否可以在前一個命令的結果之前繼續?
ie:如果從bash腳本中運行以下兩個命令,可能會失敗嗎?
cp /tmp/a /tmp/b
cp /tmp/b /tmp/c
從bash腳本運行命令時,bash總是等待上一個命令完成,還是隻是啓動命令,然後繼續下一個命令?bash命令是否可以在前一個命令的結果之前繼續?
ie:如果從bash腳本中運行以下兩個命令,可能會失敗嗎?
cp /tmp/a /tmp/b
cp /tmp/b /tmp/c
是的,如果你什麼也不做,然後在bash腳本命令序列化。你可以告訴bash運行一束平行的命令,然後等待他們全部完成,但做這樣的事情:
command1 &
command2 &
command3 &
wait
在每個前三行的末尾的&符號告訴Bash在後臺運行該命令。第四個命令wait
告訴bash等待所有子進程退出。
請注意,如果您這樣做,您將無法獲得子命令的退出狀態(並且set -e
將不起作用),因此您將無法判斷它們是成功還是失敗以通常的方式。
bash manual有更多的信息(搜索wait
,約下降三分之二)。
一般來說,除非明確地發送到後臺或將自己作爲守護進程退出,否則shell腳本中的命令將被序列化。
他們等到前一個完成。 但是,您可以編寫2個腳本並在不同的進程中運行它們,以便它們可以同時執行。這真是一個瘋狂的猜測,但是我認爲如果一個進程試圖寫入正被另一個進程讀取的文件,你會得到一個訪問錯誤。
我想你想要的是一個subshell的概念。以下是我剛剛搜索的一個參考:http://www.linuxtopia.org/online_books/advanced_bash_scripting_guide/subshells.html
呃,沒有。子外殼可能切線有用,但是它本身不會在後臺運行。默認情況下,父shell等待子shell完成,就像它創建的任何其他進程一樣。 – tripleee
除非您明確告訴bash在後臺啓動進程,否則它將等待進程退出。所以如果你這樣寫:
foo args &
bash將繼續而不用等待foo退出。但是如果你沒有明確地把進程放在後臺,bash會等待它退出。
從技術上講,一個過程可以通過分出孩子然後退出來有效地將自己置於背景中。但由於這種技術主要用於長壽命過程,所以這不會影響到你。
在命令的末尾添加'&'以並行運行。 但是,這很奇怪,因爲在你的情況下,第二個命令取決於第一個命令的最終結果。無論是使用順序命令或複製到B和C從這樣的:
cp /tmp/a /tmp/b &
cp /tmp/a /tmp/c &
+1:關於複製到/ tmp/b然後將/ tmp/b複製到/ tmp/c的問題的好處! –
這僅僅是一個人爲的例子(: – corydoras
這很清楚,我的觀點是在並行化相關命令時要小心:) –
您可以_can_實際捕獲進程的返回狀態。使用'$!'獲取每個命令的pid,將它們保存在一個數組中,然後遍歷該數組,調用'wait pid; echo $?'爲每個pid。 –