Вывод из -x идет в stderr, а не в stdout. Но даже это может быть проблемой - множество сценариев будут иметь функциональные зависимости от содержимого stderr, и в некоторых случаях смешивать потоки отладки и stderr довольно сложно.
Версии Bash> 4.1 предлагают другое решение: переменная среды BASH_XTRACEFD позволяет вам указать файловый дескриптор, который будет использоваться для отправки потока отладки. Это может быть файл или канал или любое другое unix-y качество, которое вам нравится.
# Use FD 19 to capture the debug stream caused by "set -x":
exec 19>/tmp/my-script.log
# Tell bash about it (there's nothing special about 19, its arbitrary)
export BASH_XTRACEFD=19
# turn on the debug stream:
set -x
# run some commands:
cd /etc
find
echo "Well, that was fun."
# Close the output:
set +x
exec 19>&-
# See what we got:
cat /tmp/my-script.log
Немного повозившись, вы можете делать другие вещи - например, делать «тройник» для потоков stdout и / или stdin и чередовать их с выходными данными отладки, чтобы ваш журнал был более полным. Подробнее об этом см. Https://stackoverflow.com/questions/3173131/redirect-copy-of-stdout-to-log-file-from-within-bash-script-itself .
Большим преимуществом этого подхода перед альтернативами является то, что вы не рискуете изменить поведение вашего скрипта, вставляя выходные данные отладки в stdout или stderr.