Come eseguire il debug di uno script Bash Shell sotto Linux o UNIX

Ott 6, 2021
admin

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.
Come eseguire il debug di uno script di shell bash su Linux o Unix
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"
o
DEBUG 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:

Come eseguire il debug di uno script di shell Bash sotto Linux o UNIX usando la funzione di evidenziazione della sintassi di Vim

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

🐧 Ricevi gli ultimi tutorial su Linux, Open Source & DevOps via RSS feed o newsletter settimanale.
🐧 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

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.