是否可以在不中断命令替换的情况下设置BASH_XTRACEFD = 1?

时间:2019-03-05 19:10:02

标签: bash

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

1 个答案:

答案 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的副本。