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

Immagine di copertina

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:

  • cd fallisce perché la cartella non esiste
  • Bash stampa l’errore e…
  • Bash prosegue
  • Così rm gira 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 $USRENAME che 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 bash come shebang
  • aggiungi set -euo pipefail subito 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).

Conosci meglio chi ha scritto questo articolo

Serena Sensini

Ciao! Mi chiamo Serena Sensini e sono la creatrice di @ TheRedCode.it. Ho aperto questo blog nel 2021 per raccontare il mio lavoro e il mondo dell’informatica a parole semplici, in piccole pillole e alla portata di tutte le persone.

Sono un’ingegnera informatica specializzata in ambito AI & NLP. Di giorno lavoro come CTO @ Welyk e come Innovation & Emerging Technologies Leader @ Dedalus, mentre di notte scrivo e sono autrice di 5 libri -per ora-. 🖊️

Foto di Serena Sensini

Partners

Community, aziende e persone che supportano attivamente il blog

Vuoi diventare partner?

Collaboriamo con community, aziende e strumenti del mondo tech che vogliono raggiungere la nostra community di dev ed engineer italiani. Scrivici per proporre una collaborazione.

✉️ Scrivici

Vuoi diventare tech content creator? 🖊️

Se ti va di raccontare la tua esperienza nel mondo tech, questo è il posto giusto.

Cerchiamo voci autentiche, esempi pratici e punti di vista utili per chi legge.

Scrivici a collaborazioni[at]theredcode.it con una proposta: idea, taglio del contenuto e una breve presentazione. Non vediamo l'ora di leggere la tua esperienza!

Invia la tua idea