Sobes.tech
Middle

Cum gestionezi erorile utilizatorului în bash?

sobes.tech AI

Răspuns de la AI

În bash, erorile utilizatorului sunt gestionate în principal folosind:

  • Codurile de ieșire ale comenzilor: Fiecare comandă returnează un cod de finalizare (stare de ieșire). 0 indică de obicei succes, orice altă valoare indică o eroare.
  • Structuri condiționale: if, elif, else sunt folosite pentru a verifica codurile de ieșire.
  • Operatori logici: && (și), || (sau) permit executarea comenzilor în funcție de succes/eșecul celor anterioare.
  • Redirecționări ale ieșirii: > (stdout), 2> (stderr), &> (stdout și stderr).
  • Capcane (traps): Permite executarea unei comenzi la primirea unui semnal sau la încheierea unui script.

Exemple:

#!/bin/bash

# Verificarea codului de ieșire
if ! command_that_might_fail; then
  echo "Eroare la executarea comenzii!" >&2 # Redirecționare către stderr
  exit 1 # Încheierea scriptului cu cod de eroare
fi

# Operator logic &&
command_successful && echo "Comanda a fost executată cu succes" || echo "Comanda s-a încheiat cu o eroare"

# Capcana pentru SIGINT (Ctrl+C)
trap 'echo "S-a primit semnalul de întrerupere. Ieșire..."; exit 1' SIGINT

# Redirecționarea erorilor și mesaj
if command_with_errors 2> error.log; then
  echo "Comanda a fost executată fără erori"
else
  echo "Erori detectate. Detalii în error.log"
fi

Pentru creșterea fiabilității scripturilor, se folosesc de asemenea:

  • set -e: Scriptul se oprește dacă orice comandă eșuează (cu excepția verificărilor în if și while).
  • set -u: Variabilele trebuie să fie definite înainte de utilizare.
  • set -o pipefail: Codul de ieșire al unei pipe va fi cel al ultimei comenzi care a eșuat.
#!/bin/bash

set -euo pipefail

# Acest script se va încheia dacă "undefined_var" nu este setată
echo "$undefined_var"

# Acest script se va încheia dacă "failing_command" returnează un cod diferit de zero
failing_command

Utilizarea funcțiilor și argumentelor:

#!/bin/bash

# Funcție cu verificare a argumentelor
validate_args() {
  if [ $# -ne 2 ]; then
    echo "Utilizare: $0 <argument1> <argument2>" >&2
    exit 1
  fi
}

validate_args "$@"