Deoarece o astfel de comandă va rula și (sperăm că) se va finaliza în fundal, nu pot obține starea ei de ieșire; asta este în ordine.
Această afirmație este incorectă pentru început:
#!/bin/bash
unele_comandă &
pid="$!"
așteptați -n „$pid”
echo "Starea a fost ${?}."
Dacă doriți să fiți notificat imediat, puteți folosi câteva trucuri bazate pe semnal.
Manipularea de SIGCHLD
ar fi cea mai evidentă opțiune, dar (1) suportul său în Bash este buggy și (2) în ciuda set -b
, capcană
handlerii vor aștepta de fapt limitele de comandă.
Acestea fiind spuse, următoarea cea mai bună opțiune (care întrerupe, de asemenea, procesarea în prim-plan de lungă durată imediat când unele_comandă
fails) este (un echivalent al) generarea unui Ctrl+C pentru întregul grup de procese. Acesta este livrat și acționat imediat, shell-ul în sine poate gestiona semnalul și poate continua, dacă se dorește, în timp ce procesul din prim-plan va ieși, probabil, implicit etc.
#!/bin/bash
set -e
handler() {
echo „eșecul comenzii semnalat”
capcană - INT
}
manevrător de capcane INT
fundal() {
local -ir pid="$1"
schimb
„$@” || kill -INT -- -"$pid"
}
fundal „$$” some_command &
# sarcină în prim-plan de lungă durată
ecou „înainte de procesare lungă”
dormi 5 || ecou „procesare lungă întreruptă”
ecou „după procesare lungă”
Încercați să înlocuiți unele_comandă
cu (de ex.) dormi 2
pentru a testa cazul „de succes”.