A saída de -x vai para stderr, não para stdout. Mas mesmo isso pode ser um problema - muitos scripts terão dependências funcionais no conteúdo do stderr, e é um pouco confuso ter os fluxos debug e stderr misturados em alguns casos.
Versões bash > 4.1 oferecem uma solução diferente: a variável de ambiente BASH_XTRACEFD permite que você especifique um descritor de arquivo que será usado para enviar o fluxo de depuração. Isso pode ser um arquivo ou pipe ou qualquer outra coisa que você goste.
# 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
Com um pouco mais de brincadeira, você pode fazer outras coisas - como fazer um 'tee' nos stdout e / ou stdin streams, e intercalar aqueles com a saída de depuração, para que seu log seja mais completo. Para mais detalhes, consulte link .
A grande vantagem dessa abordagem sobre alternativas é que você não está arriscando mudanças no comportamento do seu script, injetando a saída de depuração em stdout ou stderr.