rit*_*att 2 pager zsh git oh-my-zsh
我的 Oh-my-zsh 执行以下操作:
当我运行该git log --pretty --oneline
命令时,它会按预期显示一长串提交列表。
当我点击 时q,它突然消失并显示以下输出:
$ git log --pretty --oneline
FAIL: 141
Run Code Online (Sandbox Code Playgroud)
为什么会发生这种情况?我该如何解决?
\xe2\x80\x9cFAIL\xe2\x80\x9d 之后的数字是进程的退出状态。由 shell 报告的进程的退出状态通常为\xc2\xb9:
\n141 表示信号 13,即SIGPIPE。在底层, git 命令在两个子命令之间设置一个管道:一个子命令收集数据并将数据写入管道,另一个子命令是pager less
。如果您不查看整个输出,则分页器将退出而不等待第一个子命令退出。当第一个子命令接下来尝试写入管道时,它会被 SIGPIPE 终止。这是正常行为,以避免命令继续计算和写入没有任何内容正在读取的输出。
没有什么可以修复的。但如果您发现这分散了您的注意力,您可以更改您的主题,使其在 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
:定义是
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,
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?, ,
,第二行还有一个匹配的右括号。)
\xc2\xb9这里的细节是题外话。
\n