equivalente "eco" no linux?

27

Como posso stdout todos os comandos executados no script bash?

Essa saída deve conter os comandos output E os próprios comandos.

eu encontrei

#!/bin/bash -x

mas isso não é exatamente o mesmo, porque em vez de

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

isto mostra

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

Respostas:

29

Use bash -v.

Este é o script:

#!/bin/bash -v

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

echo "Done."

Esta é a saída:

#!/bin/bash -v

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

echo "Done."
Done.

Infelizmente, não existe um marcador especial PS4para imprimir comandos expandidos. Você pode combinar os dois para identificar rapidamente os 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
fonte
12

set -x é outra maneira de fazê-lo.

$ cat a.sh
#!/bin/bash

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

A saída será:

sh a.sh
+ echo 'Hello, World'
+ sed 's|Hello|Goodbye|'
Goodbye, World
+ echo Done.
Done.
Ashok Vairavan
fonte
1
Qual é o tipo de coisa que o OP considerou inútil na pergunta dele ...
Daniel Beck
@Ashok Você poderia explicar? Não consigo ver a diferença: aqui ps: GNU bash, versão 4.1.5 (1) -release (i486-pc-linux-gnu) Ubuntu 10.04.3
Putnik
1
@Putnik É a mesma coisa básica, mas você pode set -xem qualquer lugar do script e até mesmo desativá-lo novamente. Então, se você quiser apenas na echo "Done"linha, coloque um set -xpouco antes dessa.
Daniel Beck