Sobes.tech
Middle

Comment gérez-vous les erreurs utilisateur dans bash?

sobes.tech IA

Réponse de l'IA

En bash, les erreurs utilisateur sont principalement gérées à l'aide de:

  • Codes de sortie des commandes : Chaque commande retourne un code de fin (statut de sortie). 0 indique généralement le succès, toute autre valeur indique une erreur.
  • Structures conditionnelles : if, elif, else sont utilisés pour vérifier les codes de sortie.
  • Opérateurs logiques : && (et), || (ou) permettent d'exécuter des commandes en fonction du succès/échec des précédentes.
  • Redirections de sortie : > (stdout), 2> (stderr), &> (stdout et stderr).
  • Trappes (traps) : Permettent d'exécuter une commande lors de la réception d'un signal ou à la fin d'un script.

Exemples :

#!/bin/bash

# Vérification du code de sortie
if ! command_that_might_fail; then
  echo "Erreur lors de l'exécution de la commande!" >&2 # Redirection vers stderr
  exit 1 # Fin du script avec un code d'erreur
fi

# Opérateur logique &&
command_successful && echo "Commande réussie" || echo "La commande a échoué"

# Trap pour gérer SIGINT (Ctrl+C)
trap 'echo "Signal d'interruption reçu. Sortie..."; exit 1' SIGINT

# Redirection des erreurs et message
if command_with_errors 2> error.log; then
  echo "Commande exécutée sans erreurs"
else
  echo "Erreurs détectées. Détails dans error.log"
fi

Pour améliorer la fiabilité des scripts, on utilise aussi :

  • set -e : Le script se termine si une commande échoue (sauf dans if et while).
  • set -u : Les variables doivent être définies avant utilisation.
  • set -o pipefail : Le code de sortie d'une pipeline sera celui de la dernière commande ayant échoué.
#!/bin/bash

set -euo pipefail

# Ce script se terminera si "undefined_var" n'est pas défini
echo "$undefined_var"

# Ce script se terminera si "failing_command" retourne un code non nul
failing_command

L'utilisation de fonctions et d'arguments :

#!/bin/bash

# Fonction avec vérification des arguments
validate_args() {
  if [ $# -ne 2 ]; then
    echo "Utilisation : $0 <argument1> <argument2>" >&2
    exit 1
  fi
}

validate_args "$@"