Gli strumenti che abbiamo introdotto finora ci permettono di creare script anche molto complessi, e perciò saremo sempre più esposti a commettere errori di ogni genere. Il debugging è quindi un'attività molto importante per ogni programmatore, e inizia dal saper leggere con attenzione i messaggi di errore (se ne abbiamo ottenuto uno). Tuttavia i messaggi di errore prodotti da Bash sono spesso molto criptici, anche se dovuti a semplici errori di sintassi, che non sempre sono di facile individuazione. Per questo è bene conoscere alcuni piccoli accorgimenti che possono aiutarci a scovare i bug in maniera più agile e veloce, risparmiando tempo ed energie.
Esistono due modalità offerte da Bash per l'esecuzione di uno script, che possono aiutare a scoprire facilmente gli errori: la modalità verbose e quella xtrace. La prima si attiva aggiungendo l'opzione -v
quando si esegue uno script (ad esempio sh -v script.sh
); in questa modalità, ogni comando viene stampato (nel canale stderr
) così come deve essere eseguito, prima di effettuare ogni singola espansione. La seconda modalità - di gran lunga più utile - si attiva aggiungendo l'opzione -x
. In modalità xtrace, Bash stampa (sempre nel canale stderr
) ogni comando come è stato eseguito dopo ogni espansione, indicando inoltre il livello di ogni subshell in cui è stato eseguito (utilizzando il prefisso +
per ciascuna di esse).
Vediamo un semplice esempio: lo script bug.sh
di seguito riportato genera un errore.
#!/bin/bash
hello="hello world"
[ $hello = hello ]
Eseguendo sh -x bug.sh
possiamo facilmente individuarne la causa:
$ sh -x bug.sh
+ hello='hello world'
+ '[' hello world = hello ']'
bug.sh: line 3: [: too many arguments
Il comando test
infatti riconosce hello
e world
come due parole separate; abbiamo quindi dimenticato di racchiudere la variabile $hello
fra virgolette, come si nota dalla sua espansione effettuata da Bash.
La creazione di uno script - così come più in generale la programmazione - è un processo incrementale, che consiste nel procedere aggiungendo pezzo per pezzo nuove funzioni e comandi ad un'applicazione esistente, verificandone progressivamente il funzionamento. Non è quindi frequente il caso in cui si debba effettuare il debug di uno script per intero, ma solo piccoli componenti che si vanno via via ad aggiungere. In Bash possiamo attivare sia la modalità xtrace che quella verbose solo in alcune porzioni del codice, utilizzando il comando set
: una volta specificato set -x
(rispettivamente -v
), ogni comando successivo verrà eseguito in modalità xtrace (rispettivamente verbose), fino a quando non si giunge al termine dello script o ad un comando set +x
(rispettivamente +v
).
Le modalità offerte da Bash per il debugging sono da utilizzare come pratici meccanismi per una più facile individuazione degli errori, ma non sono comunque l'unica tecnica da dover usare. L'uso del comando echo
per controllare il contenuto di variabili, posizionato strategicamente all'interno di uno script, è spesso una soluzione più che valida per individuare malfunzionamenti. Comunque sia, in attività come la programmazione o il debugging, la pratica è ciò che permette di definire la strategia che ciascuno trova migliore e più efficiente per le proprie esigenze.