Tom Hale Asked: 2019-05-04 01:54:12 +0800 CST2019-05-04 01:54:12 +0800 CST 2019-05-04 01:54:12 +0800 CST 在 zsh 中的 stderr 以外的其他地方直接输出 xtrace 772 在 zsh 中,是否可以将跟踪输出从set -x( set -o xtrace) 定向到 stderr 以外的文件描述符? 我正在寻找一种等效的$BASH_XTRACEFD方法或一种方法来模拟相同的行为。 zsh debugging 2 个回答 Voted Best Answer Gilles 'SO- stop being evil' 2019-05-04T13:00:47+08:002019-05-04T13:00:47+08:00 从 zsh 5.7 开始,答案是否定的。跟踪输出总是到 stderr。 来源:阅读来源。跟踪输出被写入文件xtrerr,看起来很有希望,但唯一的分配xtrerr是 to stderr,它的副本,或 to NULL。 应该可以编写一个动态加载的模块来设置xtrerr,但是在 zsh 源代码树之外编写一个模块并不容易。 xtrace一种可能的解决方法是使用陷阱进行模拟。在大多数情况下,这提供了相同的基本信息,但我确信有很多极端情况很难或不可能完美地模拟。一个区别是选项的继承和陷阱的继承在某些与函数、子shell等相关的情况下遵循不同的规则。概念证明:DEBUG xtracextraceemulate trap 'print -r -- "+$0:$LINENO>$ZSH_DEBUG_CMD" >>trace_file' DEBUG 或者可能更复杂一点(未经测试): zmodload zsh/system sysopen -a -o create -u xtrace_fd trace_file trap 'syswrite -o $xtrace_fd "+$0:$LINENO>$ZSH_DEBUG_CMD"' DEBUG Doron Behar 2019-05-20T04:18:56+08:002019-05-20T04:18:56+08:00 我正在使用一个非常简单的解决方法,如果您只想调试特定功能,这可能很有用,尽管可以将相同的想法应用于完成跟踪set -x: 当我需要调试特定功能时,比如说myfunc,我打开一个子 shell,TRACE_FUNC=myfunc zsh -l 2> debug.err.txt而我已经~/.zshrc按照以下方式设置了一些东西: if [ -n "${TRACE_FUNC}" ]; then functions -t "$TRACE_FUNC" fi 您可以通过输入以下内容来应用相同的想法~/.zshrc: if [ -n "${TRACE_ZSH}" ]; then set -x fi 并使用TRACE_ZSH=1 zsh -l 2> debug.err.txt.
从 zsh 5.7 开始,答案是否定的。跟踪输出总是到 stderr。
来源:阅读来源。跟踪输出被写入文件
xtrerr
,看起来很有希望,但唯一的分配xtrerr
是 tostderr
,它的副本,或 toNULL
。应该可以编写一个动态加载的模块来设置
xtrerr
,但是在 zsh 源代码树之外编写一个模块并不容易。xtrace
一种可能的解决方法是使用陷阱进行模拟。在大多数情况下,这提供了相同的基本信息,但我确信有很多极端情况很难或不可能完美地模拟。一个区别是选项的继承和陷阱的继承在某些与函数、子shell等相关的情况下遵循不同的规则。概念证明:DEBUG
xtrace
xtrace
emulate
或者可能更复杂一点(未经测试):
我正在使用一个非常简单的解决方法,如果您只想调试特定功能,这可能很有用,尽管可以将相同的想法应用于完成跟踪
set -x
:当我需要调试特定功能时,比如说
myfunc
,我打开一个子 shell,TRACE_FUNC=myfunc zsh -l 2> debug.err.txt
而我已经~/.zshrc
按照以下方式设置了一些东西:您可以通过输入以下内容来应用相同的想法
~/.zshrc
:并使用
TRACE_ZSH=1 zsh -l 2> debug.err.txt
.