Bash

為什麼雙&符號鏈條件在最後一個條件下一起在後台執行?

  • February 27, 2021

我有一些後台作業執行的條件:

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 ifs 很噁心,這就是為什麼我不會接受它作為替代方式。

**編輯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 &)

應該做的伎倆。

引用自:https://unix.stackexchange.com/questions/169289