Вихід з -x йде на stderr, а не stdout. Але навіть це може бути проблемою - велика кількість скриптів матиме функціональну залежність від вмісту stderr та його різновиду безладдя, щоб потоки налагодження та stderr змішувалися разом у деяких випадках.
Версії Bash> 4.1 пропонують інше рішення: змінна середовище BASH_XTRACEFD дозволяє вказати дескриптор файлу, який буде використовуватися для надсилання потоку налагодження. Це може бути файл або труба або будь-яке інше добро, яке вам подобається.
# 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 та переплутати ті, хто має вихід налагодження, щоб ваш журнал був більш повним. Детальніше про це дивіться на веб-сторінці /programming/3173131/redirect-copy-of-stdout-to-log-file-from-within-bash-script-itself .
Велика перевага цього підходу перед альтернативами полягає в тому, що ви не ризикуєте змінити поведінку свого сценарію, вводячи вихідний налагодження в stdout або stderr.