解决方法
-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流上做’tee’,然后用调试输出交错,这样你的日志就更完整了.有关详细信息,请参阅https://stackoverflow.com/questions/3173131/redirect-copy-of-stdout-to-log-file-from-within-bash-script-itself.