equivalente "echo on" para linux?

27

¿Cómo puedo obtener stdout todos los comandos que se ejecutan en script bash?

Es decir, la salida debe contener comandos de salida Y comandos en sí mismos.

encontré

#!/bin/bash -x

pero esto no es exactamente lo mismo porque en lugar de

 mysql -v dbname < dump.sql | grep "CREATE TABLE"

muestra

+ mysql -v dbname
+ grep 'CREATE TABLE'
Putnik
fuente

Respuestas:

29

Uso bash -v.

Este es el guión:

#!/bin/bash -v

echo "Hello, World" | sed 's|Hello|Goodbye|'

echo "Done."

Esta es la salida:

#!/bin/bash -v

echo "Hello, World" | sed 's|Hello|Goodbye|'
Goodbye, World

echo "Done."
Done.

Desafortunadamente, no hay un marcador especial como PS4para imprimir comandos expandidos. Sin embargo, puede combinar ambos para identificar rápidamente los comandos:

#!/bin/bash -vx

echo "Hello, World" | sed 's|Hello|Goodbye|'
+ echo 'Hello, World'
+ sed 's|Hello|Goodbye|'
Goodbye, World

echo "Done."
+ echo Done.
Done.
Daniel Beck
fuente
12

set -x es otra forma de hacerlo.

$ cat a.sh
#!/bin/bash

set -x
echo "Hello, World" | sed 's|Hello|Goodbye|'
echo "Done."

La salida será:

sh a.sh
+ echo 'Hello, World'
+ sed 's|Hello|Goodbye|'
Goodbye, World
+ echo Done.
Done.
Ashok Vairavan
fuente
1
Lo cual es algo que el OP desestimó como inútil en su pregunta ...
Daniel Beck
@ Ashsh ¿Podrías explicarme? No puedo ver la diferencia: aquí ps: GNU bash, versión 4.1.5 (1) -release (i486-pc-linux-gnu) Ubuntu 10.04.3
Putnik
1
@Putnik Es lo mismo básico, pero puedes set -xen cualquier parte del script e incluso desactivarlo nuevamente. Entonces, si solo lo quieres en la echo "Done"línea, ponlo set -xjusto antes de ese.
Daniel Beck