Quando uno script in bash cresce in dimensioni, diventa sempre più difficile trovare eventuali errori nel codice.
La shell GNU bash fornisce a questo scopo alcune funzionalità di debug.
La più immediata ed interessante è la “modalità debug“, che si attiva eseguendo la sotto-shell con l’opzione -x; in questa modalità ogni comando più ogni suo argomento è stampato sullo standard output dopo che le variabili sono state sostituite, ma prima di essere eseguito, ad esempio:
~$ cat script.sh #!/bin/bash VARTEST="variabile di test" echo "$VARTEST" echo "" ~$ bash -x script.sh + VARTEST='variabile di test' + echo 'variabile di test' variabile di test + echo '' ~$
Si può attivare la modalità di debug anche solo in un pezzo del codice, in questo modo:
~$ cat script.sh #!/bin/bash VARTEST="variabile di test" set -x echo "$VARTEST" set +x echo "" ~$ bash script.sh + echo 'variabile di test' variabile di test + set +x ~$
E’ possibile passare dalla modalità debug alla modalità normale quante volte si vuole all’interno di uno script.
Altro strumento utile è la “modalità di non-esecuzione“; in questa modalità la sintassi viene analizzata in cerca di errori, senza però eseguire i comandi dello script. La modalità è attivabile attraverso l’opzione -n, sia per tutto lo script che per una sua parte soltanto, in maniera analoga all’opzione precedente:
~$ cat script.sh #!/bin/bash echo "inizio test" NUM=2 echo "numero = $NUM" if [[ 1 -lt $NUM ]] then echo $NUM maggiore di 1 ~$ bash -n script.sh script.sh: riga 8: errore di sintassi: fine di file non attesa ~$
Applicato su una porzione di codice:
~$ cat script.sh #!/bin/bash echo "inizio test" set -n NUM=2 echo "numero = $NUM" if [[ 1 -lt $NUM ]] then echo $NUM maggiore di 1 set +n ~$ bash script.sh inizio test script.sh: riga 10: errore di sintassi: fine di file non attesa ~$