Ricerca nel sito web

Come eseguire la modalità di debug del controllo della sintassi negli script di shell


Abbiamo iniziato la serie sul debug degli script di shell spiegando le diverse opzioni di debug e come abilitare le modalità di debug degli script di shell.

Dopo aver scritto gli script della shell, è consigliabile controllare praticamente la sintassi degli script prima di eseguirli, invece di guardare il loro output per confermare che funzionino correttamente.

In questa parte della serie, esamineremo come utilizzare la modalità di debug del controllo della sintassi. Ricorda che abbiamo spiegato le diverse opzioni di debug nella prima parte di questa serie e qui le utilizzeremo per eseguire il debug degli script.

Abilitazione della modalità di debug dettagliata

Prima di passare all'argomento principale di questa guida, esploriamo brevemente la modalità dettagliata. È abilitato dall'opzione di debug -v, che dice alla shell di visualizzare tutte le righe in uno script mentre vengono lette.

Per dimostrare come funziona, di seguito è riportato uno script di shell di esempio per convertire in batch le immagini PNG nel formato JPG.

Digitalo (o copialo e incollalo) in un file.

#!/bin/bash
#convert
for image in *.png; do
        convert  "$image"  "${image%.png}.jpg"
        echo "image $image converted to ${image%.png}.jpg"
done
exit 0

Quindi salva il file e rendi eseguibile lo script utilizzando il comando seguente:

chmod +x script.sh

Possiamo invocare lo script e visualizzare tutte le righe in esso contenute così come vengono lette dalla shell in questo modo:

bash -v script.sh

Abilitazione della modalità di debug del controllo della sintassi negli script di shell

Tornando al nostro argomento di enfasi, -n attiva la modalità di controllo della sintassi. Ordina alla shell di leggere sostanzialmente tutti i comandi, ma non li esegue, (la shell) esamina solo la sintassi utilizzata.

Nel caso in cui ci siano errori nello script della shell, la shell visualizzerà gli errori sul terminale, altrimenti non visualizzerà nulla.

La sintassi per attivare il controllo della sintassi è la seguente:

bash -n script.sh

Poiché la sintassi nello script è corretta, il comando precedente non visualizzerà alcun output. Proviamo quindi a rimuovere la parola done che chiude il ciclo for e vediamo se mostra un errore:

Di seguito è riportato lo script di shell modificato per convertire in batch le immagini PNG nel formato jpg che contiene un bug.

#!/bin/bash
#script with a bug
#convert
for image in *.png; do
        convert  "$image"  "${image%.png}.jpg"
        echo "image $image converted to ${image%.png}.jpg"

exit 0

Salvare il file, quindi eseguirlo mentre si esegue il controllo della sintassi:

bash -n script.sh

Dall'output sopra, possiamo vedere che c'è un problema di sintassi con il nostro script, nel ciclo for manca una parola chiave done di chiusura. E la shell lo ha cercato fino alla fine del file e una volta che non lo ha trovato (fatto), la shell ha stampato un errore di sintassi:

script.sh: line 11: syntax error: unexpected end of file

Possiamo anche combinare insieme la modalità dettagliata e la modalità di controllo della sintassi:

bash -vn script.sh

In alternativa, possiamo abilitare il controllo della sintassi modificando la prima riga dello script sopra come nel prossimo esempio.

#!/bin/bash -n
#altering the first line of a script to enable syntax checking

#convert
for image in *.png; do
    convert  "$image"  "${image%.png}.jpg"
    echo "image $image converted to ${image%.png}.jpg"

exit 0

Come prima, salva il file ed eseguilo mentre esegui il controllo della sintassi:

./script.sh

script.sh: line 12: syntax error: unexpected end of file

Inoltre, possiamo utilizzare il comando integrato set shell per abilitare la modalità di debug nello script sopra.

Nell'esempio seguente, stiamo solo controllando la sintassi del ciclo for nel nostro script.

#!/bin/bash
#using set shell built-in command to enable debugging
#convert

#enable debugging
set -n
for image in *.png; do
    convert  "$image"  "${image%.png}.jpg"
    echo "image $image converted to ${image%.png}.jpg"

#disable debugging
set +n
exit 0

Ancora una volta, salva il file e richiama lo script:

./script.sh 

In sintesi, dovremmo sempre assicurarci di controllare sintatticamente i nostri script di shell per acquisire eventuali errori prima di eseguirli.

Per inviarci domande o feedback relativi a questa guida, utilizzare il modulo di risposta riportato di seguito. Nella terza parte di questa serie, passeremo alla spiegazione e all'utilizzo della modalità di debugging del tracciamento della shell.