2012-01-31 7 views
63

Se inserisco l'opzione bash -x, mostrerà tutta la linea. Ma lo script verrà eseguito normalmente.Come eseguire lo script bash riga per riga?

Come eseguire una riga per riga? Di quanto posso vedere se fa la cosa giusta, o abortisco e correggi il bug. Lo stesso effetto è messo un read in ogni riga.

+0

Forse più in generale puoi anche https://stackoverflow.com/questions/951336/how-to-debug-a-bash-script/45096876#45096876 – tripleee

risposta

87

Non è necessario inserire una lettura in ogni riga, basta aggiungere una trappola come la seguente nel tuo script bash, ha l'effetto desiderato, ad es.

#!/usr/bin/env bash 
set -x 
trap read debug 

< YOUR CODE HERE > 

Funziona, appena testato con bash v4.2.8 e v3.2.25.


versione migliorata

Se lo script sta leggendo il contenuto dai file, quanto sopra elencato non funzionerà. Una soluzione alternativa potrebbe essere simile all'esempio seguente.

#!/usr/bin/env bash 
echo "Press CTRL+C to proceed." 
trap "pkill -f 'sleep 1h'" INT 
trap "set +x ; sleep 1h ; set -x" DEBUG 

< YOUR CODE HERE > 

Per fermare lo script si dovrebbe uccidere da un altro shell in questo caso.


ALTERNATIVE1

Se si vuole semplicemente attendere alcuni secondi prima di procedere al comando successivo nello script che segue potrebbe funzionare per voi.

#!/usr/bin/env bash 
trap "set +x; sleep 5; set -x" DEBUG 

< YOUR CODE HERE > 

Aggiungo set + x e set -x all'interno del comando trap per rendere l'output più leggibile.

+1

Quindi come si passa alla riga successiva (eseguire il comando successivo)? –

+2

intercetta una lettura su ogni comando.L'unica cosa che devi fare è premere Invio per passare al prossimo comando. –

+0

Funziona anche con ksh, se ti piace usare un'altra shell. – ChrisGer

10

Forse lo BASH Debugger è qualcosa per te.

+1

Questa è davvero la soluzione migliore. Permette di visualizzare la linea prima che venga eseguita (e molto altro). Sulla maggior parte dei sistemi può essere installato con 'apt-get install bashdb'. Quindi devi solo eseguire 'bashdb your_command.sh', digitare' step', e poi premere invio a capo dopo. – studgeek

+0

@studgeek non è disponibile su Redhat/CentOS ecc. Quindi non chiamerei "la maggior parte dei sistemi". – Sajuuk

0

Se lo script di bash è davvero un gruppo di comandi one off che si desidera eseguire uno per uno, è possibile eseguire un'operazione come questa, che esegue ciascun comando uno alla volta quando si incrementa una variabile LN, corrispondente alla riga numero che si desidera eseguire. Ciò ti consente di eseguire nuovamente l'ultimo comando in modo super facile, quindi devi solo incrementare la variabile per passare al comando successivo.

Supponendo che i comandi siano in un file "it.sh", eseguire quanto segue, uno alla volta.

$ cat it.sh 
echo "hi there" 
date 
ls -la /etc/passwd 

$ $(LN=1 && cat it.sh | head -n$LN | tail -n1) 
"hi there" 

$ $(LN=2 && cat it.sh | head -n$LN | tail -n1) 
Wed Feb 28 10:58:52 AST 2018 

$ $(LN=3 && cat it.sh | head -n$LN | tail -n1) 
-rw-r--r-- 1 root wheel 6774 Oct 2 21:29 /etc/passwd 
Problemi correlati