Bash
為什麼雙&符號鏈條件在最後一個條件下一起在後台執行?
我有一些後台作業執行的條件:
condition-command && condition-command && background-job &
問題是:我希望在作業執行之前阻止條件,就好像我已經執行了:
condition-command; condition-command; background-job &
但這不是條件,如果先前的命令失敗,我不希望作業執行。
我意識到它是非同步的,但它不應該,在我看來,以下兩個腳本應該是相同的,但它們不是:
sleep 2; echo foo & sleep 1; echo bar; wait # prints foo, then bar: correct sleep 2 && echo foo & sleep 1; echo bar; wait # prints bar, then foo: bug
我知道如果我測試
$?
變數它會起作用,或者如果我把最後一個變數放在一個子shell中(但是我會失去工作控制,我想避免守護程序),但我想知道為什麼 bash 會這樣,在哪裡它記錄了嗎?有什麼辦法可以防止這種行為?編輯: Chained
if
s 很噁心,這就是為什麼我不會接受它作為替代方式。**編輯2:**我知道子shell是可能的,但它對我不起作用,讓我們想像一下我想最後執行一堆命令
wait
。如果我檢查/proc/$PID
目錄的存在是可能的,但是如果有幾個工作,那將是一件很痛苦的事情。**編輯 3:**主要問題是為什麼 bash 這樣做,它在哪裡記錄?是否有解決方案是一個獎勵!
如果您不希望背景應用於整行,請使用
eval
:sleep 2 && eval 'sleep 10 &'
現在只有第二個命令將是後台作業,它將是您可以進行的適當的後台作業
wait
。
編輯後:問題在於它
&&
的優先級高於&
,因此整個事物綁定在一起成為一個AND list
,並作為一個單元獲得背景。請參閱手冊中的命令列表,儘管不是很清楚。對原始程式碼的最小更改是
if condition-command && condition-command; then background-job & fi
(它是一個
if
,但不是一個鍊式的)。只是
condition-command && condition-command && (background-job &)
應該做的伎倆。