我试图让线束执行一个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]$
答案 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
输出。