导出 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
输出。
我正在尝试获取由 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
输出。