эквивалентное «эхо» для Linux?

27

Как мне получить стандартный вывод всех команд, которые выполняются в скрипте bash?

То есть вывод должен содержать команды вывода и сами команды.

я нашел

#!/bin/bash -x

но это не совсем то же самое, потому что вместо

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

это показывает

+ mysql -v dbname
+ grep 'CREATE TABLE'
Putnik
источник

Ответы:

29

Использование bash -v.

Это скрипт:

#!/bin/bash -v

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

echo "Done."

Это вывод:

#!/bin/bash -v

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

echo "Done."
Done.

К сожалению, нет специального маркера, как PS4для печати расширенных команд. Вы можете комбинировать и то и другое, чтобы быстро идентифицировать команды:

#!/bin/bash -vx

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

echo "Done."
+ echo Done.
Done.
Даниэль Бек
источник
12

set -x - другой способ сделать это.

$ cat a.sh
#!/bin/bash

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

Выход будет:

sh a.sh
+ echo 'Hello, World'
+ sed 's|Hello|Goodbye|'
Goodbye, World
+ echo Done.
Done.
Ашок Вайраван
источник
1
Что-то вроде того, что ОП отклонил как бесполезное право в своем вопросе ...
Даниэль Бек
@Ashok Не могли бы вы объяснить? Я не могу видеть разницу: здесь PS: GNU Баш, версия 4.1.5 (1) -release (i486-ПК-Linux-гну) Ubuntu 10.04.3
Putnik
1
@Putnik Это та же самая базовая вещь, но вы можете в set -xлюбом месте сценария и даже деактивировать ее снова. Так что, если вы хотите, чтобы это было на echo "Done"линии, поставьте set -xпрямо перед этим.
Даниэль Бек