有没有一种方法可以通过运行带有-x选项的bash脚本将显示的信息发送到文件,而不会更改运行该脚本的用户看到的标准输出?
这是我要在经常使用的bash脚本中实现的调试功能。
非常感激。
有没有一种方法可以通过运行带有-x选项的bash脚本将显示的信息发送到文件,而不会更改运行该脚本的用户看到的标准输出?
这是我要在经常使用的bash脚本中实现的调试功能。
非常感激。
Answers:
-x的输出转到stderr,而不是stdout。但这甚至可能是一个问题-许多脚本将对stderr的内容具有功能依赖性,并且在某些情况下将调试流和stderr流混合在一起也很麻烦。
Bash版本> 4.1确实提供了不同的解决方案:BASH_XTRACEFD环境变量允许您指定文件描述符,该文件描述符将用于将调试流发送到该文件描述符。这可以是文件或管道,也可以是您喜欢的任何其他Unix优点。
# 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”,然后将它们与debug输出交错,这样您的日志就更完整了。有关更多信息,请参见/programming/3173131/redirect-copy-of-stdout-to-log-file-from-within-bash-script-itself。
与其他方法相比,这种方法的最大优点是,您无需冒着通过将调试输出注入到stdout或stderr中而改变脚本行为的风险。
exec 19>&-
)?以我的经验,脚本完成后会自动关闭。