将 bash 脚本的一部分重定向到文件以捕获 set -x 输出

将 bash 脚本的一部分重定向到文件以捕获 set -x 输出

我有一个 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

相关内容