`set -x` 导致 bash 打印到哪里?

irr*_*rom 4 bash

如果我set -x在我的 bash 会话(v4.1.2(2) - CentOS 6.10)中,我得到:

$ ls /root
+ ls --color=auto /root
ls: cannot open directory /root: Permission denied
Run Code Online (Sandbox Code Playgroud)

太好了,它回显了我运行并打印出终端的命令。这是预期的。现在,如果我都重定向stdoutstderr到另一个文件。

$ ls /root  &> stuff.txt
+ ls --color=auto /root
Run Code Online (Sandbox Code Playgroud)

它仍然将命令打印到终端。

哪里set -x有bash的打印,如果它是不是stderr还是stdout

lar*_*sks 10

set -x命令将跟踪信息打印到stderr.

当您运行此命令时...

ls /root  &> stuff.txt
Run Code Online (Sandbox Code Playgroud)

你只是重定向stdoutstderrls命令。您当前的shell也没有更改,这是您运行set -x.


正如 Mad Physicist 指出的那样,技术答案是“它记录到BASH_XTRACEFD”,默认为stderr. 您可以通过执行以下操作将当前 shell 的跟踪日志记录重定向到另一个文件:

# open a new file descriptor for logging
exec 4> trace.log

# redirect trace logs to fd 4
BASH_XTRACEFD=4

# enable tracing
set -x
Run Code Online (Sandbox Code Playgroud)

  • 从技术上讲,它会打印到“BASH_XTRACEFD”设置的任何内容。 (4认同)