set -euo pipefail devrait être la première ligne de tout script shell non trivial après le shebang.

#!/bin/bash
set -euo pipefail

Voilà pourquoi :

set -e : le script s’arrête à la première commande qui échoue. Sans ça, le script continue comme si de rien n’était après un cd /tmp/inexistant. J’ai perdu des heures à comprendre pourquoi un rm -rf s’exécutait dans le mauvais dossier à cause d’un cd silencieusement raté.

set -u : utiliser une variable non définie = erreur fatale. rm -rf $UNDEFINED_VAR/ sans -urm -rf /. Avec -u → le script s’arrête avant de faire n’importe quoi.

set -o pipefail : sans cette option, false | true retourne 0 (le code de true, la dernière commande du pipe). Avec pipefail, le pipe échoue si UNE SEULE commande échoue. Essentiel dans kubectl get pods | grep Running | wc -l : si kubectl échoue, on veut le savoir, pas compter silencieusement zéro pods.

Le piège

set -e a des comportements subtils. Une commande dans un if ne déclenche pas d’erreur (c’est voulu). Une commande dans une substitution $(...) non plus. Et grep qui ne trouve rien retourne le code 1, ce qui peut casser le script si on ne l’a pas prévu.

Mon pattern pour grep dans un script set -e :

if grep -q "pattern" fichier; then
    echo "trouvé"
fi
# OU
grep "pattern" fichier || true

Mon template de script shell

#!/bin/bash
set -euo pipefail
IFS=$'\n\t'  # gestion sûre des espaces dans les noms de fichiers

# Reste du script...

Le IFS empêche le splitting sauvage sur les espaces. Avec ces 3 lignes, on élimine 90% des bugs silencieux en shell.