Come eseguire il debug dello script bash?


31

Esiste un modo per eseguire il debug dello script bash senza usare l'eco e la registrazione?

Sto parlando di usare punti di interruzione e cose del genere.

Risposte:



20

Esistono diversi modi, ad esempio:

  • Esegui lo script con l'opzione -x

    bash -x yourscript.sh
  • Aggiungi set -xuna nuova riga all'inizio del file di script dopo Shebang #!/bin/bashe prima dell'inizio dello script, set -vvisualizzerebbe le righe di input della shell, set -xvisualizzerà i comandi e gli argomenti eseguiti

  • sostituisci lo shebang del tuo file di script con #!/bin/bash -xv




4

Puoi usare questa piccola funzione per entrare in "console":

function debug
{
    echo "#############|  Entering DEBUG mode  |####################";
    cmd=""
    while [[ $cmd != "exit" ]]; do
        read -p "> " cmd
        case "$cmd" in
            vars ) ( set -o posix ; set );;
            exit ) ;;
            * ) eval "$cmd";;
        esac
    done
    echo "#############|  End of DEBUG mode |####################";
}

Quindi, all'interno del tuo script (ESEMPIO):

for file in *; do
...
   if [[ $file == "strange_case.txt" ]]; then
       # break the code here to analyze:
       debug
   fi
...
done

Accetterà qualsiasi comando, mantenendo intatte le variabili locali. Per uscire dalla modalità "debug", digita "esci" (non uscirà dallo script) e continuerà con il codice. Se si utilizza "debug" all'interno di un ciclo, si interromperà ogni volta. Puoi avvolgerlo all'interno di un "if" (come nell'esempio sopra) o creare una funzione "watch":

function debug_watch
{
    if [[ $1 == $2 ]]; then
        debug
    fi
}

# And Use it:

debug_watch "$file" "strange_case.txt"

Ho anche aggiunto il comando "vars" che scaricherà tutte le variabili disponibili e i loro valori. Puoi anche aggiungere i tuoi comandi personalizzati.

Ho creato il codice in pochi minuti, quindi usalo a tuo rischio. Tenere presente che in modalità debug è possibile eseguire qualsiasi comando, quindi si pone un rischio per la sicurezza se lo si lascia in uno script di produzione.


3
Evitare l'uso di nomi di variabili maiuscole. Il tuo rischio ha la precedenza su variabili shell speciali e variabili d'ambiente. Inoltre, assicurati di citare le espansioni dei parametri quando vengono utilizzate come argomenti, per evitare la divisione delle parole e l'espansione del percorso che si verificano sul risultato. eg * ) eval "$cmd" ;;e debug_watch "$file" strange_case.txt.
geirha,

Codice modificato come suggerito da geirha.
lepe

2

In base a ciò che NES sta dicendo ci sono flag impostati in bash per consentire il debug.

Il set -xflag può essere impostato e non impostato dal terminale o dall'interno dello script. Utilizzando +o -:

#!/bin/bash
#fileinfo
ls -l $1
set -x      # start debugging here
wc -l $1
set +x      # stop debugging here
file $1
set -v      # start verbose output
w | more    
echo ""
echo -n "Number of users: "
set +v      # end verbose output
who | wc -l

Ecco cosa fanno i setcomandi:

  • set -f Disabilita la generazione del nome file utilizzando i metacaratteri.
  • set -v Stampa (in modo dettagliato) le linee di input della shell man mano che vengono lette.
  • set -x Stampa le tracce dei comandi prima di eseguire il comando.

setin realtà ha molte funzionalità, ma purtroppo nessuna pagina man in quanto è uno strumento integrato nella shell. Il manuale per set è nella documentazione di GNU Bash .

Esistono numerosi strumenti da riga di comando che potrebbero aiutarti a ottenere dettagli sul tuo programma come:

  • stat visualizza lo stato del file o del file system
  • file determinare un tipo di file.
  • hexdump filtro che visualizza i file specificati in vari formati
  • nohup Esegui uno script che non si blocchi

    e numerosi altri. Stavo cercando di pensare al comando che mostra i personaggi nascosti, ma non posso farlo ora. Hexdump lo farà, ma ce n'è uno migliore.

Il comando chiave ctrl\farà eseguire il core dump di un programma o uno script in esecuzione. Quindi potresti analizzare il coredump. Probabilmente userei gdb per analizzare un coredump, ma esistono molti programmi per questo.

La shell bash ha alcune eleganti opzioni anche per il debug. opzioni --debugger, -vverbose --dump-stringse altre eleganti opzioni per aiutarti. Controllali usando man bash.

Il trapcomando (shell integrata) potrebbe essere molto utile per te. trap dice che se il tuo programma esce inaspettatamente, esegui qualcosa. Leggi trappola e altri utili comandi incorporati di Bash Shell qui .

Parlando in generale per il momento, il debug è un argomento enorme in qualsiasi lingua. Alcuni altri argomenti che possono essere utili per il debug in qualsiasi linguaggio di programmazione includono il reindirizzamento della shell e l'elaborazione del segnale.

Infine, mi rendo conto che l'esempio che ho usato è banale, ma che alcuni script di shell possono essere centinaia di righe. In tali situazioni, mi piace inserire tag di commenti e bloccare il codice che sospetto sia difettoso oppure, in alternativa, inserire un comando di uscita e provare a isolare il codice funzionale dal codice non funzionante, utilizzando una tecnica di divisione e conquista.


1

Un'opzione GUI per il debug di uno script bash è l'IDE Eclipse con i plug-in BashEclipse / Shelled.

Questo fornisce le funzionalità della tua domanda ( breakpoints and stuff) insieme a una serie di altre funzionalità per il debug di script bash complessi.

Alcune delle funzionalità includono:
( https://unix.stackexchange.com/questions/155551/how-to-debug-a-bash-script )

  • Attiva / disattiva punto di interruzione
  • Operazione singola passo-passo
  • Funzioni step-in, step-out, step-over e routine secondarie
  • Esame delle variabili di codice in qualsiasi momento durante l'esecuzione dello script
  • Elenco attività TODO
  • Elenco dei segnalibri
  • Modifica di più finestre
  • Condivisione remota dell'ambiente di progetto

La prospettiva di Script Editor: IDE script Eclipse

La prospettiva di debug: Prospettiva di debug dello script Eclipse

I passaggi per l'uso è aggiungere i plug Shellede BashEclipseper eclissi. Quindi eseguire la procedura fornita in BashEclipse leggimi il file di testo per avviare il debugger.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.