Si ingreso la opción bash -x , mostrará toda la línea. Pero el script se ejecutará normalmente.
¿Cómo puedo ejecutar línea por línea? Entonces puedo ver si hace lo correcto, o aborto y soluciono el error. Se pone el mismo efecto readen cada línea.
No necesita poner una lectura en cada línea, solo agregue una trampa como la siguiente en su script bash, tiene el efecto que desea, por ejemplo.
#!/usr/bin/env bashset-x
trap read debug
< YOUR CODE HERE >
Funciona, solo lo probé con bash v4.2.8 y v3.2.25.
VERSIÓN MEJORADA
Si su secuencia de comandos está leyendo contenido de archivos, la lista anterior no funcionará. Una solución alternativa podría parecerse al ejemplo siguiente.
#!/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 el script, tendría que matarlo desde otro shell en este caso.
ALTERNATIVA1
Si simplemente desea esperar unos segundos antes de continuar con el siguiente comando en su secuencia de comandos, 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.
Entonces, ¿cómo pasa a la siguiente línea (ejecuta el siguiente comando)?
David Doria
2
Atrapa una lectura en cada comando. Lo único que debe hacer es presionar regresar para ir al siguiente comando
organic-mashup
1
si tiene líneas de comando como esta "mientras lee la línea; haga echo $ línea; hecho <algún archivo" ese método no funciona porque "trampa leer DEBUG" leer la línea de algún archivo
mug896
3
¿Cómo haces que se detenga? Después de recorrer el script hasta el final, el shell actúa como si el script todavía se estuviera ejecutando.
slashdottir
1
Cambie a trap 'read -u1' debugpara anular el problema de redirección de lectura de archivos.
Esta 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. Entonces solo necesita ejecutar bashdb your_command.sh, escribir stepy luego presionar retorno de carro después de eso.
studgeek
1
@studgeek no está disponible en Redhat / CentOS, etc., así que no lo llamaría "la mayoría de los sistemas".
Sajuuk
@Sajuuk, puede que no esté empaquetado , pero está absolutamente disponible .
Charles Duffy
macOS:brew install bashdb
boweeb
@CharlesDuffy: tampoco está en los repositorios predeterminados de Ubuntu.
Dan Dascalescu
2
Si su script bash es realmente un grupo 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 al número de línea que desea ejecutar . Esto le permite ejecutar el último comando nuevamente de manera 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)WedFeb2810:58:52 AST 2018
$ $(LN=3&& cat it.sh | head -n$LN | tail -n1)-rw-r--r--1 root wheel 6774Oct221:29/etc/passwd
Respuestas:
No necesita poner una lectura en cada línea, solo agregue una trampa como la siguiente en su script bash, tiene el efecto que desea, por ejemplo.
Funciona, solo lo probé con bash v4.2.8 y v3.2.25.
VERSIÓN MEJORADA
Si su secuencia de comandos está leyendo contenido de archivos, la lista anterior no funcionará. Una solución alternativa podría parecerse al ejemplo siguiente.
Para detener el script, tendría que matarlo desde otro shell en este caso.
ALTERNATIVA1
Si simplemente desea esperar unos segundos antes de continuar con el siguiente comando en su secuencia de comandos, el siguiente ejemplo podría funcionar para usted.
Estoy agregando set + x y set -x dentro del comando trap para que la salida sea más legible.
fuente
trap 'read -u1' debugpara anular el problema de redirección de lectura de archivos.Quizás el depurador BASH sea algo para ti.
fuente
apt-get install bashdb. Entonces solo necesita ejecutarbashdb your_command.sh, escribirstepy luego presionar retorno de carro después de eso.brew install bashdbSi su script bash es realmente un grupo 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 al número de línea que desea ejecutar . Esto le permite ejecutar el último comando nuevamente de manera 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.
fuente
Eche un vistazo a bash-stepping-xtrace .
Permite pisar xtrace.
fuente
xargs: puede filtrar líneas
fuente