答案1
一般来说,如果你运行setopt xtrace
在嘚会话或开始嘚和zsh -x
,嘚将在执行时打印每个命令及其参数,包括用于设置提示或其他挂钩函数的内部参数。
这可能会产生很多输出,因为哦我的天啊可能会运行相当多的函数只是为了显示提示。它看起来会像这样:
[...] +__config.git:9> 返回 1 +__tempdirs:1> 模拟 -L zsh +__tempdirs:2> setopt Extendedglob 复制代码 +__tempdirs:3> setopt nullglob +__tempdirs:4> 本地 -a 匹配 mbegin 修补 +__tempdirs:5> [[ d == d ]] +__tempdirs:6> [[ /home/adaephon == (#b)(/tmp/foo/)([^/]##)* ]] +__tempdirs:10> 返回 1 +xtermtitle:5> 本地'前言=pts/32 adaephon@tau:' +xtermtitle:6> 本地‘cl=’ [...]
每行都以 的值作为前缀PROMPT4
,默认情况下为+%N:%i>
。%N
代表脚本、源文件或函数的名称,%i
代表行号。其余部分是命令运行时的内容,即所有替换和扩展之后的内容。
例如:
+__tempdirs:6> [[ /home/adaephon == (#b)(/tmp/foo/)([^/]##)* ]]
指的是某个名为 的脚本或函数的第 6 行__tempdirs
。在我的 zsh 配置中查找此行,我发现:
if [[ $2 = (#b)(/tmp/foo/)([^/]##)* ]]; then
在我的配置__tempdirs
中zsh_directory_name_functions
,它是函数列表嘚用于动态目录命名。由于当前工作目录显示为我的正常提示的一部分,因此每次在显示提示之前都会运行它。
在您的情况下,错误消息“管道损坏”将出现在发生错误的行下方。管道命令的元素通常首先逐行打印,然后是输出,但可能会有点复杂:
tau% 设置 xtrace tau% echo foo | sed 's/o/u/g' | (sed 's/u/a/g' ;回显栏)| sed 's/a/e/g' +zsh:4> 回显 foo +zsh:4> sed s/o/u/g +zsh:4> sed s/u/a/g +zsh:4> sed s/a/e/g 呼呼 +zsh:4> 回音栏 比特 tau%