Как я могу напечатать каждую команду перед выполнением?

Каков наилучший способ настроить скрипт Bash, который печатает каждую команду перед ее выполнением?

Это было бы здорово для отладки.

Я уже попробовал это:

CMD="./my-command --params >stdout.txt 2>stderr.txt"
echo $CMD
'$CMD'

Это должно было напечатать это первым:

./my-command --params >stdout.txt 2>stderr.txt

А затем выполните ./my-command --params, с выводом, перенаправленным в указанные файлы.

Ответ 1

set -o xtrace

или

bash -x myscript.sh

Это работает со стандартным /bin/sh, а также с IIRC (тогда это может быть POSIX)

И помните, что bashdb (bash Shell Debugger, release 4.0-0.4)


Чтобы вернуться в нормальное состояние, выйдите из подоболочки или

set +o xtrace

Ответ 2

Самый простой способ сделать это - позволить bash сделать это:

set -x

Или запустите его явно как bash -x myscript.

Ответ 3

set -x нормально, но если вы сделаете что-то вроде:

set -x;
command;
set +x;

это приведет к печати

+ command
+ set +x;

Вы можете использовать подоболочку, чтобы предотвратить это, например:

(set -x; command)

который просто напечатает команду.

Ответ 4

set -x отлично.

Другой способ распечатать каждую выполненную команду - использовать trap с DEBUG. Поместите эту строку в начало вашего script:

trap 'echo "# $BASH_COMMAND"' DEBUG

Здесь вы можете найти множество других trap обычаев .