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

exporting xtrace/BASH_XTRACEFD but xtrace output going to stderr, not custom filedescriptor

我正在尝试获取由 harness 执行的 shell 脚本以使用 harness' BASH_XTRACEFD。这是我尝试显示问题的精简版本。我想要 /tmp/xtrace 中的 '+ echo foobar' 并且不想在 /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]$

这似乎是 bash 4.1.x.

中的错误

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

ee. Fixed a bug that caused bash to not change the xtrace file descriptor if BASH_XTRACEFD was found in the shell environment at startup.

上面所说的快速测试(使用 bash 4.1.2)表示您只需在脚本中设置 BASH_XTRACEFD 即可生效(并且会立即生效)。

因此,如果您将 BASH_XTRACEFD=$BASH_XTRACEFD 粘贴在 /tmp/subject 的顶部,您将按照您想要的方式在文件中看到它的 xtrace 输出。