我的 Oh-my-zsh 执行以下操作:
当我运行该
git log --pretty --oneline
命令时,它会按预期显示一长串提交列表。当我点击 时q,它突然消失并显示以下输出:
$ git log --pretty --oneline FAIL: 141
为什么会发生这种情况?我该如何解决?
答案1
“FAIL”后面的数字是进程的退出状态。由 shell 报告的进程的退出状态通常为 1:
- 0 如果程序正常退出并报告成功。
- 如果程序正常退出并报告错误,则为 1 到 125。
- 128+s如果程序被杀死信号 s, 在哪里s是一个小整数。
141 表示信号 13,即信号管道。在底层,git 命令在两个子命令之间设置一个管道:一个子命令收集数据并将数据写入管道,另一个子命令是寻呼机 less
。如果您没有查看整个输出,则寻呼机将退出而不等待第一个子命令退出。当第一个子命令接下来尝试写入管道时,它会被 SIGPIPE 终止。这是正常行为,以避免命令继续计算和写入没有任何内容正在读取的输出。
没有什么可以修复的。但如果您发现这分散了您的注意力,您可以更改您的主题,使其在 SIGPIPE 时不报告失败状态。执行此操作的方法取决于您的 oh-my-zsh 主题,但从我快速查看可以看到(我不使用 oh-my-zsh),那些带有 FAIL 一词的主题通过设置PROMPT
变量,使用条件提示扩展如果命令的退出状态非零,则仅打印 FAIL 内容。因此,如果退出状态为 141,您需要更改它以采用“无失败”分支。如果您使用与 oh-my-zsh 捆绑的主题,请FAIL
在主题定义中查找~/.oh-my-zsh/themes/$ZSH_THEME.zsh-theme
。让我们举个例子dst.zsh-theme
:定义是
PROMPT='%(?, ,%{$fg[red]%}FAIL%{$reset_color%}
)
%{$fg[magenta]%}%n%{$reset_color%}@%{$fg[yellow]%}%m%{$reset_color%}: %{$fg_bold[blue]%}%~%{$reset_color%}$(git_prompt_info)
$(prompt_char) '
(请注意,它跨越多行。)一般模式是在成功(等于 0)和失败(包括信号)时打印。因此,如果等于 141,我们将添加另一个条件:%(?,IFSUCCESS,IFFAILURE)
IFSUCCESS
$?
IFFAILURE
$?
PROMPT='%(141?, ,%(?, ,%{$fg[red]%}FAIL%{$reset_color%}
))
%{$fg[magenta]%}%n%{$reset_color%}@%{$fg[yellow]%}%m%{$reset_color%}: %{$fg_bold[blue]%}%~%{$reset_color%}$(git_prompt_info)
$(prompt_char) '
(请注意,除了前面的 之外%(141?, ,
,第二行还有一个匹配的右括号。)
1此处的细节与主题无关。