我有一个bash脚本,其输出试图通过使用-x
运行bash进行调试。我还希望将输出重定向到stdout而不是stderr(因为我们使用的日志记录框架将所有stderr内容都视为高优先级错误)。
但是,我的代码中的命令替换失败,因为set -x
记录的行与实际的预期输出混合在一起,如下面的日志所示。
在将set -x
日志定向到标准输出时,如何避免此错误?
示例:
root@ee0d2037fdca:/# $(echo "ls")
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@ee0d2037fdca:/# set -x
root@ee0d2037fdca:/# export BASH_XTRACEFD=1
+ export BASH_XTRACEFD=1
+ BASH_XTRACEFD=1
root@ee0d2037fdca:/# $(echo "ls")
+ ++ echo ls ls
bash: ++: command not found
root@ee0d2037fdca:/#
答案 0 :(得分:2)
不是将1
分配给BASH_XTRACEFD
,而是使用FD 1的副本创建新的文件描述符,并指向BASH_XTRACEFD
。
exec {BASH_XTRACEFD}>&1
set -x
$(echo "ls") # note that this is bad practice; see BashFAQ #50
这样,您的命令替换将更改 real FD 1,但不保留原始 FD 1的副本。