Puncte:4

Cum să ascundeți rezultatul primei comenzi când utilizați || operator și ieșire?

drapel cn

Aceasta ascunde rezultatul de la prima comandă și se tipărește Hopa! la stderr dacă eșuează. Până acum, bine.

#!/usr/bin/env bash
invalid_command > /dev/null 2>&1 || >&2 ecou „Hopa”
ecou salut

Asta scoate asta:

Hopa!
Bună

Dar trebuie să ies și să imprim un mesaj dacă prima comandă a eșuat. Așa că am încercat să folosesc paranteze.

#!/usr/bin/env bash
invalid_command > /dev/null 2>&1 || (>&2 echo „Hopa”; ieșire)
ecou salut

Iată rezultatul:

Hopa!
Bună

Dar acum Ieșire nu funcționează pentru că o face într-un subshell, determinând imprimarea Bună, chiar dacă am vrut ca scenariul să iasă.

Deci, cum îl fac pe Bash ecou ceva text și ieșiți dacă o anumită comandă a eșuat folosind || operator? Sunt conștient că pot folosi un dacă one-liner pentru a face asta, dar aș prefera să nu trebuiască să folosesc un plin dacă afirmație dacă o pot evita.

#!/usr/bin/env bash
if [ "$(invalid_command > /dev/null 2>&1 ; printf $?)" != "0" ]; apoi >&2 echo 'Oops'; ieșirea 1; fi
drapel cn
`[` este o comandă care evaluează o expresie și își setează propriul cod de ieșire în mod corespunzător, care este apoi consumat de instrucțiunea `if`. De asemenea, puteți scrie `dacă ! invalid_command >>/dev/null 2>&1; apoi ecou >&2 Hopa; Ieșire; fi`.
Puncte:9
drapel sd

Utilizare gruparea comenzilor (observați că ; pe sfârșitul Ieșire).

#!/usr/bin/env bash
invalid_command > /dev/null 2>&1 || { >&2 echo „Hopa” ; Ieșire; }
ecou salut

Returnează asta pe terminalul meu.

$ ./test.sh 
Hopa!

Dacă aveți multe comenzi, puteți capta toate erorile.

#!/usr/bin/env bash
on_error() {
    >&2 ecou „Hopa”
    iesirea 1
}
capcană 'on_error' ERR
invalid_command > /dev/null 2>&1
ecou salut

Aceasta se va imprima Hopa! și ieșiți imediat, dacă vreo comandă din script eșuează.

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.