La salida de -x va a stderr, no stdout. Pero incluso eso puede ser un problema: muchos scripts tendrán dependencias funcionales del contenido de stderr, y es un poco complicado tener las secuencias de depuración y stderr mezcladas en algunos casos.
Las versiones Bash> 4.1 ofrecen una solución diferente: la variable de entorno BASH_XTRACEFD le permite especificar un descriptor de archivo que se utilizará para enviar la secuencia de depuración. Esto puede ser un archivo o una tubería o cualquier otra bondad de Unix que desee.
# 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
Con un poco más de violín, puede hacer otras cosas, como hacer un 'tee' en las secuencias stdout y / o stdin, e intercalar aquellas con la salida de depuración, para que su registro esté más completo. Para obtener más detalles sobre esto, consulte /programming/3173131/redirect-copy-of-stdout-to-log-file-from-within-bash-script-itself .
La gran ventaja de este enfoque sobre las alternativas es que no está arriesgando cambios en el comportamiento de su script al inyectar la salida de depuración en stdout o stderr.