Coduri de ieșire ($?, &&, ||) în Linux / Bash

Scripting Bash POSIX / Bash (PIPESTATUS)

Fiecare comandă întoarce un cod: 0 pentru succes, 1-255 pentru eroare. Se citește cu $? și se folosește cu && și ||.

Sintaxă comandă
comanda; echo $?
comanda1 && comanda2
comanda1 || comanda2

Ce face Coduri de ieșire ($?, &&, ||)

Orice comandă Linux se termină cu un cod de ieșire (exit status). Prin convenție, 0 înseamnă succes, iar orice altă valoare (1-255) înseamnă eroare sau un rezultat negativ, de exemplu grep întoarce 1 când nu găsește textul. Codul ultimei comenzi stă în variabila specială $?.

Operatorul && rulează a doua comandă doar dacă prima a reușit, iar || doar dacă prima a eșuat. Funcțiile își setează codul cu return N, iar scripturile cu exit N.

Câteva coduri au sens fix: 126 (fișierul există, dar nu poate fi executat), 127 (comanda nu a fost găsită), 128+N (procesul a fost oprit de semnalul N, de exemplu 130 pentru Ctrl+C). În Bash, tabloul PIPESTATUS păstrează codurile tuturor comenzilor din ultimul pipeline.

Opțiuni și argumente

Opțiune / Parametru Descriere
$? Codul de ieșire al ultimei comenzi.
cmd1 && cmd2 Rulează cmd2 doar dacă cmd1 întoarce 0.
cmd1 || cmd2 Rulează cmd2 doar dacă cmd1 întoarce un cod diferit de 0.
return N / exit N Încheie funcția / scriptul cu codul N (0-255).
${PIPESTATUS[@]} Codurile fiecărei comenzi din ultimul pipeline (Bash).
true / false Comenzi care întorc mereu 0 / 1.

Exemple

Exemplul 1: Codul de ieșire al lui grep

grep -q nu afișează nimic; rezultatul căutării se vede doar în cod.

grep -q "Iași" <<< "Ana locuiește în Iași"
echo "Textul a fost găsit: cod $?"
grep -q "Cluj" <<< "Ana locuiește în Iași" || echo "Textul nu a fost găsit: cod $?"
nu_exista_comanda 2>/dev/null || echo "Comandă inexistentă: cod $?"

Rezultat

Textul a fost găsit: cod 0
Textul nu a fost găsit: cod 1
Comandă inexistentă: cod 127

Exemplul 2: O funcție care întoarce un cod

Funcția răspunde prin cod, nu prin text, deci poate fi folosită direct într-un if.

este_nota_valida() {
  local nota=$1
  if [ "$nota" -ge 1 ] && [ "$nota" -le 10 ]; then
    return 0
  fi
  return 1
}
for n in 9 12; do
  if este_nota_valida "$n"; then
    echo "$n: notă validă"
  else
    echo "$n: notă invalidă (cod $?)"
  fi
done

Rezultat

9: notă validă
12: notă invalidă (cod 1)

Exemplul 3: Lanțuri cu && și codurile dintr-un pipeline

PIPESTATUS trebuie citit imediat după pipeline, altfel este suprascris de următoarea comandă.

mkdir -p raport && echo "Raport Iași: 12 comenzi" > raport/zi.txt && cat raport/zi.txt
false | true | true
echo "Coduri în pipeline: ${PIPESTATUS[*]}"

Rezultat

Raport Iași: 12 comenzi
Coduri în pipeline: 1 0 0

Greșeli frecvente

  • Citirea lui $? după alt echo sau if: valoarea este deja a comenzii noi. Salvează codul imediat: cod=$?.
  • Folosirea lui a && b || c ca înlocuitor pentru if/else: c rulează și când a reușește, dar b eșuează.
  • exit 256 sau return -1: codurile sunt limitate la 0-255, deci 256 devine 0 (succes).

Comenzi înrudite

  • exit: Încheie execuția shell-ului sau a scriptului curent și transmite un cod numeric de stare sistemului.
  • Funcții în Bash: Gruparea instrucțiunilor în blocuri reutilizabile de cod, cu variabile locale și parametri.
  • set -euo pipefail: Face un script Bash să se oprească la prima eroare, la variabile nedefinite și la comenzi eșuate din pipeline.
  • test, [ ] și [[ ]]: Verifică fișiere, numere și texte și întoarce codul 0 (adevărat) sau 1 (fals), folosit în if, while și cu && / ||.