导出xtrace / BASH_XTRACEFD但是xtrace输出转到stderr,而不是自定义文件描述符

时间:2015-11-29 20:19:41

标签: bash debugging file-descriptor

我试图让线束执行一个shell脚本来使用线束' BASH_XTRACEFD。这是我试图表明问题的精简版本。我想' + echo foobar'在/ tmp / xtrace中,不想在/ tmp / subject中引用/ tmp / xtrace。

[bash]$ cat /tmp/harness
#!/bin/bash
exec 6> /tmp/xtrace
export BASH_XTRACEFD=6
set -o xtrace
export SHELLOPTS
/tmp/subject
set +o xtrace
[bash]$ cat /tmp/subject
#!/bin/bash
echo foobar
echo $SHELLOPTS
echo $BASH_XTRACEFD
ls -l /dev/fd/$BASH_XTRACEFD
[bash]$ /tmp/harness
+ echo foobar
foobar
+ echo braceexpand:hashall:interactive-comments:xtrace
braceexpand:hashall:interactive-comments:xtrace
+ echo 6
6
+ ls -l /dev/fd/6
l-wx------ 1 build build 64 Nov 29 12:15 /dev/fd/6 -> /tmp/xtrace
[bash]$ cat /tmp/xtrace 
+ export SHELLOPTS
+ /tmp/subject
+ set +o xtrace
[bash]$

1 个答案:

答案 0 :(得分:2)

这似乎是bash 4.1.x中的一个错误。

来自bash版本changelog(位于bash-4.2-alpha部分):

  

EE。修复了导致bash不更改xtrace文件描述符的错误       在启动时在shell环境中找到了BASH_XTRACEFD。

说快速测试(使用bash 4.1.2)表明你可以在脚本中设置BASH_XTRACEFD使其生效(并立即生效)。

因此,如果您将BASH_XTRACEFD=$BASH_XTRACEFD放在/tmp/subject的顶部,您将按照自己的方式在文件中看到xtrace输出。