zsh 中除 stderr 之外的其他地方的直接 xtrace 输出

Tom*_*ale 6 debugging zsh

在 zsh 中,是否可以将set -x( set -o xtrace)的跟踪输出定向到 stderr 以外的文件描述符?

我正在寻找一种等效的方法$BASH_XTRACEFD或一种模拟相同行为的方法。

Gil*_*il' 5

从 zsh 5.7 开始,答案是否定的。跟踪输出总是到 stderr。

来源:阅读源码。跟踪输出被写入文件xtrerr,看起来很有希望,但唯一的分配xtrerr是 to stderr、它的副本或 to NULL。

应该可以编写一个动态加载的模块 set xtrerr,但是在 zsh 源代码树之外编写一个模块并不容易。

一种可能的解决方法是xtrace使用trap进行模拟。这在大多数情况下提供了相同的基本信息,但我相信有很多极端情况很难或不可能完美地模拟。一个区别是option的继承和trap的继承在一些与函数、子shell等相关的情况下遵循不同的规则。概念证明:DEBUG xtracextraceemulate

trap 'print -r -- "+$0:$LINENO>$ZSH_DEBUG_CMD" >>trace_file' DEBUG
Run Code Online (Sandbox Code Playgroud)

或者可能更复杂一点(未经测试):

zmodload zsh/system
sysopen -a -o create -u xtrace_fd trace_file
trap 'syswrite -o $xtrace_fd "+$0:$LINENO>$ZSH_DEBUG_CMD"' DEBUG
Run Code Online (Sandbox Code Playgroud)