¿Cómo ejecutar el script bash línea por línea?

Respuestas:

126

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 bash
set -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.

mashup orgánico
fuente
1
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.
user3132194
23

Quizás el depurador BASH sea ​​algo para ti.


fuente
3
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)
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
Brad Parks
fuente
1

xargs: puede filtrar líneas

cat .bashrc | xargs -0 -l -d \\n bash
  • -0 Tratar como entrada sin procesar (sin escape)
  • -l Separar cada línea (no por defecto para actuaciones)
  • -d \\ n El separador de línea
Tinmarino
fuente