Come eseguire il debug di uno script Bash Shell sotto Linux o UNIX
Dalla mia mailbag:
Ho scritto un piccolo script hello world. Come posso fare il debug di uno script di shell bash in esecuzione su un sistema Linux o Unix?
È la domanda più comune posta dai nuovi amministratori di sistema o utenti Linux/UNIX. Il debug degli script di shell può essere un lavoro noioso (leggi come non facile). Ci sono vari modi per eseguire il debug di uno script di shell.
È necessario passare l’argomento -x o -v alla shell bash per percorrere ogni linea dello script.
Vediamo come eseguire il debug di uno script bash su Linux e Unix utilizzando vari metodi.
Opzione -x per eseguire il debug di uno script di shell bash
Esegui uno script di shell con l’opzione -x.$ bash -x script-name
$ bash -x domains.sh
Uso del comando builtin set
La shell bash offre opzioni di debug che possono essere attivate o disattivate usando il comando set:
- set -x : Visualizza i comandi e i loro argomenti mentre vengono eseguiti.
- set -v : Visualizza le linee di input della shell mentre vengono lette.
Puoi usare i due comandi di cui sopra nello script di shell stesso:
#!/bin/bashclear # turn on debug modeset -xfor f in *do file $fdone# turn OFF debug modeset +xls# more commands
Puoi sostituire la linea Shebang standard:#!/bin/bash
con il seguente codice (per il debug):#!/bin/bash -xv
Uso della funzione intelligente DEBUG
Prima di tutto, aggiungere una variabile speciale chiamata _DEBUG. Imposta _DEBUG su ‘on’ quando hai bisogno di fare il debug di uno script:_DEBUG="on"
Metti la seguente funzione all’inizio dello script:
function DEBUG(){ && $@}
Ora, ovunque tu abbia bisogno del debug, usa semplicemente la funzione DEBUG come segue:DEBUG echo "File is $filename"
oDEBUG set -x
Cmd1
Cmd2
DEBUG set +x
Quando hai finito il debug (e prima di spostare il tuo script in produzione) imposta _DEBUG su ‘off’. Non c’è bisogno di cancellare le linee di debug._DEBUG="off" # set to anything but not to 'on'
Script di esempio:
#!/bin/bash_DEBUG="on"function DEBUG(){ && $@} DEBUG echo 'Reading files'for i in *do grep 'something' $i > /dev/null && echo "Found in $i file"doneDEBUG set -xa=2b=3c=$(( $a + $b ))DEBUG set +xecho "$a + $b = $c"
Salva e chiudi il file. Esegui lo script come segue:$ ./script.sh
Output:
Reading filesFound in xyz.txt file+ a=2+ b=3+ c=5+ DEBUG set +x+ ''+ set +x2 + 3 = 5
Ora imposta DEBUG su off (devi modificare il file):_DEBUG="off"
Esegui lo script:$ ./script.sh
Output:
Found in xyz.txt file2 + 3 = 5
Questa è una tecnica semplice ma abbastanza efficace. Puoi anche provare ad usare DEBUG come alias al posto di function.
Debuging degli errori comuni di scripting Bash Shell
Bash o sh o ksh dà vari messaggi di errore sullo schermo e in molti casi il messaggio di errore può non fornire informazioni dettagliate.
Si salta per applicare il permesso di esecuzione sul file
Quando scrivi il tuo primo script di shell bash hello world, potresti finire per ottenere un errore che si legge come segue:bash: ./hello.sh: Permission denied
Imposta il permesso usando il comando chmod:$ chmod +x hello.sh
$ ./hello.sh
$ bash hello.sh
Errore di fine file inaspettato
Se stai ricevendo un messaggio di errore di fine file inaspettato, apri il tuo file di script e assicurati che abbia sia le virgolette di apertura che di chiusura. In questo esempio, l’istruzione echo ha un apice di apertura ma nessun apice di chiusura:
#!/bin/bash.......echo 'Error: File not found ^^^^^^^ missing quote
Assicurati anche di controllare se mancano parentesi e parentesi graffe ({}):
#!/bin/bash..... && { echo "Error: Chroot dir not found"; exit 1; ^^^^^^^^^^^^^ missing brace }...
Parole chiave mancanti come fi, esac, ;;, ecc.
Se ti manca una parola chiave finale come fi o ;; otterrai un errore del tipo “xxx unexpected”. Quindi assicuratevi che tutte le dichiarazioni if e case annidate finiscano con le parole chiave appropriate. Vedere la pagina man di bash per i requisiti di sintassi. In questo esempio, fi manca:
#!/bin/bashecho "Starting..."....if then if then echo "Do something"fi for f in $filesdo echo $fdone # note fi is missing
Spostamento o modifica dello script di shell su macchine Windows o Unix
Non creare lo script su Linux/Unix e spostarlo su Windows. Un altro problema è la modifica dello script di shell bash su Windows 10 e lo spostamento/caricamento sul server Unix. Risulterà un errore come comando non trovato a causa del ritorno a capo (DOS CR-LF). Puoi convertire i newlines CR-LF del DOS nel formato Unix/Linux usando la seguente sintassi:dos2unix my-script.sh
Tip 1 – Invia il messaggio di debug a stderr
L’errore standard è il dispositivo di output di errore predefinito, che viene utilizzato per scrivere tutti i messaggi di errore del sistema. Quindi è una buona idea inviare messaggi al dispositivo di errore predefinito:
# Write error to stdoutecho "Error: file not found"## Write error to stderr (note 1>&2 at the end of echo command)#echo "Error: file not found" 1>&2
Tip 2 – Attiva l’evidenziazione della sintassi quando usi l’editor di testo vim
La maggior parte dei moderni editor di testo ti permette di impostare l’opzione di evidenziazione della sintassi. Questo è utile per rilevare la sintassi e prevenire errori comuni come l’apertura o la chiusura delle virgolette. Si può vedere lo script bash in diversi colori. Questa caratteristica facilita la scrittura in una struttura di script di shell e gli errori di sintassi sono visivamente distinti. L’evidenziazione non influenza il significato del testo stesso; è fatta solo per voi. In questo esempio, l’evidenziazione della sintassi di Vim è usata per il mio script bash:
Fig.01: evidenziazione della sintassi dello script di shell Bash usando l’editor di testo Vim
Tip 3 – Usa shellcheck per fare lint script
ShellCheck è uno strumento di analisi statica per script shell. Si può usare per trovare bug nei vostri script di shell. È scritto in Haskell. Con questo strumento si possono trovare avvisi e suggerimenti per gli script di shell bash/sh. Vediamo come installare e usare ShellCheck su un sistema Linux o Unix-like per migliorare i vostri script di shell, evitare errori e produttività.
Vedi anche:
- Vedi come attivare l’evidenziazione della sintassi nell’editor di testo vim.
- Bash man page
- BASH con Debugger e supporto migliorato per il debug e la gestione degli errori
🐧 24 commenti finora… aggiungine uno ↓
Categoria | Lista di comandi Unix e Linux |
---|---|
File Gestione | cat |
Firewall | Alpine Awall – CentOS 8 – OpenSUSE – RHEL 8 – Ubuntu 16.04 – Ubuntu 18.04 – Ubuntu 20.04 |
Utilità di rete | dig – host – ip – nmap |
OpenVPN | CentOS 7 – CentOS 8 – Debian 10 – Debian 8/9 – Ubuntu 18.04 – Ubuntu 20.04 |
Gestore dei pacchetti | apk – apt |
Gestione dei processi | bg – chroot – cron – disown – fg – jobs – killall – kill – pidof – pstree – pwdx – time |
Ricerca | grep – whereis – which |
Informazioni utente | groups – id – lastcomm – last – lid/libuser-lid – logname – members – users – whoami – who – w |
WireGuard VPN | Alpine – CentOS 8 – Debian 10 – Firewall – Ubuntu 20.04 |