2012-01-31 15 views
63

Si ingreso la opción bash -x, se mostrará toda la línea. Pero el script se ejecutará normalmente.¿Cómo ejecutar script bash línea por línea?

¿Cómo puedo ejecutar línea por línea? Entonces puedo ver si hace lo correcto, o aborto y arreglo el error. El mismo efecto se pone un read en cada línea.

+0

Quizás de manera más amplia consulta https://stackoverflow.com/questions/951336/how-to-debug-a-bash-script/45096876#45096876 – tripleee

Respuesta

87

No necesita poner una lectura en cada línea, simplemente agregue una trampa como la siguiente en su secuencia de comandos bash, que tiene el efecto que desea, por ejemplo.

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

< YOUR CODE HERE > 

Funciona, acaba de probarlo con bash v4.2.8 y v3.2.25.


versión mejorada

Si el script está leyendo el contenido de los archivos, la arriba indicada no va a funcionar. Una solución alternativa podría verse como el siguiente ejemplo.

#!/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 > 

Para detener la secuencia de comandos que tendría que matar desde otro shell en este caso.


ALTERNATIVE1

Si simplemente quiere esperar unos segundos antes de pasar al siguiente comando en el script el siguiente ejemplo podría funcionar para usted.

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

< YOUR CODE HERE > 

Estoy agregando set + x y set -x dentro del comando trap para que la salida sea más legible.

+1

Entonces, ¿cómo pasas a la siguiente línea (ejecutas el siguiente comando)? –

+2

Atrapa una lectura en cada comando.Lo único que debe hacer es presionar regresar para ir al siguiente comando –

+0

Funciona también con ksh, si a uno le gusta usar otro shell. – ChrisGer

10

Tal vez el BASH Debugger es algo para usted.

+1

Esto es realmente la mejor solución. Permite ver la línea antes de que se ejecute (y mucho más). En la mayoría de los sistemas, se puede instalar con 'apt-get install bashdb'. Luego, solo necesita ejecutar 'bashdb your_command.sh', escribir' step', y luego pulsar carriage return después de eso. – studgeek

+0

@studgeek no está disponible en Redhat/CentOS etc. por lo que no llamaría a eso "la mayoría de los sistemas". – Sajuuk

0

Si su script bash es realmente un conjunto de comandos únicos que desea ejecutar uno por uno, puede hacer algo como esto, que ejecuta cada comando uno por uno cuando incrementa una variable LN, correspondiente a la línea número que quiere ejecutar Esto le permite simplemente ejecutar el último comando de nuevo muy fácil, y luego simplemente incrementar la variable para ir al siguiente comando.

Suponiendo que sus comandos están en un archivo "it.sh", ejecute lo siguiente, uno por uno.

$ 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 
Cuestiones relacionadas