Risposte:
Sì, esiste Bash Debugger Project .
È inoltre possibile utilizzare set -x
e set -v
in fase di esecuzione. Ulteriori informazioni:
http://www.linuxtopia.org/online_books/advanced_bash_scripting_guide/debugging.html http://www.cyberciti.biz/tips/debugging-shell-script.html
In bocca al lupo!
Esistono diversi modi, ad esempio:
Esegui lo script con l'opzione -x
bash -x yourscript.sh
Aggiungi set -x
una nuova riga all'inizio del file di script dopo Shebang #!/bin/bash
e prima dell'inizio dello script, set -v
visualizzerebbe le righe di input della shell, set -x
visualizzerà i comandi e gli argomenti eseguiti
sostituisci lo shebang del tuo file di script con #!/bin/bash -xv
Oggi esiste l'estensione Debug di Visual Studio Code Bash . Ha 'Step in / out / over' e può mostrare il valore di ogni variabile.
shellcheck è il migliore in città -
puoi anche integrarti con vim, ecco il repository git -
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.
In base a ciò che NES sta dicendo ci sono flag impostati in bash per consentire il debug.
Il set -x
flag 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 set
comandi:
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.set
in 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 formatinohup
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
, -v
verbose --dump-strings
e altre eleganti opzioni per aiutarti. Controllali usando man bash
.
Il trap
comando (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.
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 )
La prospettiva di Script Editor:
I passaggi per l'uso è aggiungere i plug Shelled
e BashEclipse
per eclissi. Quindi eseguire la procedura fornita in BashEclipse leggimi il file di testo per avviare il debugger.
* ) eval "$cmd" ;;
edebug_watch "$file" strange_case.txt
.