Puncte:5

Cum verific dacă comanda a eșuat... cu o conductă?

drapel cn

Deci am un script ca acesta:

vreocomandă | grep --invert-match ceva

Aș dori să pot rula condiționat o comandă diferită dacă vreo comandă eșuează. Iată ce am încercat:

vreo comandă | grep --invert-se potrivește cu ceva || {
    ecou „Hopa”
}

Dar asta nu a funcționat ( grep nu a fost executat). Care este modalitatea corectă de a face acest lucru?

drapel hr
Poate că puteți utiliza matricea `PIPESTATUS` a lui bash: vedeți, de exemplu, [Obține starea de ieșire a procesului care este transmis către altul](https://unix.stackexchange.com/a/14276/65304)
drapel be
Când utilizați o conductă, `grep` începe *înainte de* să puteți ști neapărat dacă `somecommand` a eșuat sau nu. Doriți ca rezultatul celeilalte comenzi să meargă și la `grep`? `{ o comandă || { echo Hopa; }; } | grep ...`.
Puncte:10
drapel cn

@steeldriver mentionat in comentarii acea PIPESTATUS ar putea functiona. L-am încercat și a funcționat bine. Iată ce am făcut:

vreo comandă | grep --invert-match ceva
if [ "${PIPESTATUS[0]}" != "0" ]; atunci
    ecou „Hopa”
fi

Rulează comanda ca înainte, dar apoi am un dacă declarație să se uite la PIPESTATUS matrice. Îmi pasă doar de primul element, așa că acesta este cel la care mă uit. Am verificat că a eșuat (dacă codul de ieșire nu este 0), și a eșuat, alergați ecou „Hopa”

drapel in
Funcționează acest lucru indiferent de `set -o pipefail`?
cocomac avatar
drapel cn
@PedroA Nu știu ce înseamnă asta. Dacă îl încercați, nu ezitați să-mi editați răspunsul sau să îl publicați pe al dvs.
eckes avatar
drapel cn
Da, funcționează cu pipefail, dar nu cu `set -e -o pipefail`, deoarece nu va ajunge la if.
Puncte:7
drapel us

O altă modalitate, în funcție de comportamentul exact necesar, este utilizarea cel pipefail opțiune:

Starea de ieșire a unei conducte este starea de ieșire a ultimei comenzi în conductă, cu excepția cazului în care pipefail opțiunea este activată (vezi Decorul Incorporat). Dacă pipefail este activat, starea de returnare a conductei este valoarea lui ultima comandă (cea mai din dreapta) pentru a ieși cu o stare diferită de zero sau zero dacă toate comenzile ies cu succes.

Deci, dacă nu-ți pasă din care vreo comandă sau grep a eșuat, atâta timp cât unul dintre aceștia a eșuat:

set -o pipefail
dacă ! vreo comandă | grep --invert-potriviți ceva; atunci
    ecou „Hopa”
fi

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.