Oh-my-zsh 删除成功命令的输出“FAIL: 141”

rit*_*att 2 pager zsh git oh-my-zsh

我的 Oh-my-zsh 执行以下操作:

  1. 当我运行该git log --pretty --oneline命令时,它会按预期显示一长串提交列表。

  2. 当我点击 时q,它突然消失并显示以下输出:

    $ git log --pretty --oneline
    FAIL: 141
    
    Run Code Online (Sandbox Code Playgroud)

为什么会发生这种情况?我该如何解决?

Gil*_*il' 5

\xe2\x80\x9cFAIL\xe2\x80\x9d 之后的数字是进程的退出状态。由 shell 报告的进程的退出状态通常为\xc2\xb9:

\n
    \n
  • 0 如果程序正常退出并报告成功。
  • \n
  • 如果程序正常退出并报告错误,则为 1 到 125。
  • \n
  • 如果程序被信号s杀死,则为128+ s,其中s是一个小整数。
  • \n
\n

141 表示信号 13,即SIGPIPE。在底层, git 命令在两个子命令之间设置一个管道:一个子命令收集数据并将数据写入管道,另一个子命令是pager less。如果您不查看整个输出,则分页器将退出而不等待第一个子命令退出。当第一个子命令接下来尝试写入管道时,它会被 SIGPIPE 终止。这是正常行为,以避免命令继续计算和写入没有任何内容正在读取的输出。

\n

没有什么可以修复的。但如果您发现这分散了您的注意力,您可以更改您的主题,使其在 SIGPIPE 时不报告失败状态。执行此操作的方法取决于您的 oh-my-zsh 主题,但从我快速浏览后可以看到(我不使用 oh-my-zsh),那些带有 FAIL 一词的主题通过设置来做到这一点变量PROMPT,使用提示扩展条件仅在命令的退出状态非零时打印 FAIL 内容。因此,如果退出状态为 141,您需要更改它以获取 \xe2\x80\x9cno-failure\xe2\x80\x9d 分支。如果您使用的是与 oh-my-zsh 捆绑的主题,FAIL在主题定义中查找~/.oh-my-zsh/themes/$ZSH_THEME.zsh-theme。让我们举个例子dst.zsh-theme:定义是

\n
PROMPT=\'%(?, ,%{$fg[red]%}FAIL%{$reset_color%}\n)\n%{$fg[magenta]%}%n%{$reset_color%}@%{$fg[yellow]%}%m%{$reset_color%}: %{$fg_bold[blue]%}%~%{$reset_color%}$(git_prompt_info)\n$(prompt_char) \'\n
Run Code Online (Sandbox Code Playgroud)\n

(请注意,它跨越多行。)一般模式是在成功(等于 0)和失败(包括信号)时打印。所以我们将添加另一个条件 if%(?,IFSUCCESS,IFFAILURE)IFSUCCESS$?IFFAILURE$?因此,如果等于 141,

\n
PROMPT=\'%(141?, ,%(?, ,%{$fg[red]%}FAIL%{$reset_color%}\n))\n%{$fg[magenta]%}%n%{$reset_color%}@%{$fg[yellow]%}%m%{$reset_color%}: %{$fg_bold[blue]%}%~%{$reset_color%}$(git_prompt_info)\n$(prompt_char) \'\n
Run Code Online (Sandbox Code Playgroud)\n

(请注意,除了前面的 之外%(141?, ,,第二行还有一个匹配的右括号。)

\n

\xc2\xb9这里的细节是题外话。

\n