Bash Error Handling #1: set -euo pipefail per script shell piu sicuri

Hai presente quello script da 30 righe che “fa solo due cose” e poi, in produzione, decide di improvvisare?
Benvenuto/a nel meraviglioso mondo di Bash, dove un comando puo fallire e lo script continua comunque, sereno, come se nulla fosse.
In questa mini-serie vediamo come evitare che il tuo script si comporti come un/a collega che ignora i warning in CI.
Il problema: Bash continua anche quando dovrebbe fermarsi
Vediamo un esempio di script innocente:
#!/usr/bin/env bash
cd /cartella/che/non-esiste
rm important_file.txt
echo "Cleanup completato"
Cosa succede in pratica:
cdfallisce perché la cartella non esiste- Bash stampa l’errore e…
- Bash prosegue
- Così
rmgira nella directory corrente (cioè forse dove non volevi)
Questo comportamento di default è perfetto se il tuo obiettivo è testare i backup. Dal vivo.
La cintura di sicurezza minima: set -e
Aggiungi questa riga in cima allo script:
set -e
Significa: se un comando esce con codice diverso da 0, lo script si interrompe.
Non e magia. Non risolve ogni caso. Ma e la differenza tra:
- “Ho visto l’errore subito”
- “Ho visto l’errore due ore dopo, quando ormai era folklore aziendale”
Il problema nascosto nelle pipeline
In Bash, senza configurazioni aggiuntive, in una pipeline conta solo l’ultimo comando.
cat dati.txt | grep "errore" | sort > output.txt
Se cat fallisce, ma sort termina, puoi ritrovarti con uno script “riuscito” e un risultato sbagliato.
Soluzione:
set -o pipefail
Con pipefail, la pipeline fallisce se fallisce uno dei comandi rilevanti presenti nella catena.
Il pacchetto consigliato: set -euo pipefail
La combinazione piu usata negli script è la seguente:
set -euo pipefail
Cosa aggiunge -u (nounset):
- errore se usi variabili non definite
- evita typo tipo
$USRENAMEche diventano stringa vuota e portano a caos operativo
Esempio:
#!/usr/bin/env bash
set -euo pipefail
echo "Deploy su ambiente: $ENVIRONMENT"
Se ENVIRONMENT non è valorizzata, lo script si ferma subito. Meglio un arresto pulito che un deploy creativo.
Micro-checklist da applicare oggi
- metti
#!/usr/bin/env bashcome shebang - aggiungi
set -euo pipefailsubito dopo - evita script che assumono variabili sempre valorizzate
- testa almeno un caso di fallimento, non solo il percorso felice
In sintesi
Il default di Bash e: “vado avanti comunque”. Il tuo obiettivo e: “mi fermo quando serve”.
Nel dubbio: meno eroismo notturno, piu set -euo pipefail.
Nel prossimo episodio vediamo trap: come fare cleanup anche quando tutto va storto (o quando premi Ctrl+C con dignita).















