![将 bash 脚本的一部分重定向到文件以捕获 set -x 输出](https://linux22.com/image/96056/%E5%B0%86%20bash%20%E8%84%9A%E6%9C%AC%E7%9A%84%E4%B8%80%E9%83%A8%E5%88%86%E9%87%8D%E5%AE%9A%E5%90%91%E5%88%B0%E6%96%87%E4%BB%B6%E4%BB%A5%E6%8D%95%E8%8E%B7%20set%20-x%20%E8%BE%93%E5%87%BA.png)
我有一个 bash 脚本,我想使用 set -x 捕获脚本的一部分并将该输出重定向到文件。
我可以看到 ENVFILE 的设置,但它会输出。
有没有办法可以将 set -x 的输出捕获到文件中而不是 std out ?
#!/bin/sh
...a bunch of stuff....
if [ -e ${ENVFILE} ]; then
set -x
. ${ENVFILE}
set +x
fi # ! -e PROJOB
... a bunch of stuff ....
答案1
如果您使用的是 bash,则可以使用BASH_XTRACEFD:
...
if [ -e ${ENVFILE} ]; then
BASH_XTRACEFD=3
set -x
. ${ENVFILE}
set +x
unset BASH_XTRACEFD
fi # ! -e PROJOB
...
然后像这样执行脚本:
/path/to/script 3>/path/to/trace.output
如果您已在使用 FD 3,请使用 3 以外的文件描述符。
答案2
我会这样做。看一下代码中的注释。
#!/bin/sh
...a bunch of stuff....
if [ -e ${ENVFILE} ]; then
#save the file descriptor of the current stderr
exec 3>&2
#redirect to the file
exec 2>/.../you_file
set -x
. ${ENVFILE}
set +x
#restore original redirection
exec 2>&3
#close file descriptor 3
exec 3>&-
fi # ! -e PROJOB
... a bunch of stuff ....
如果您希望在调试内容旁边重定向标准输出,则需要使用 . 以与 fd 2 类似的方式重定向文件描述符 1 exec
。