如何配置ZSH提示符:返回码≤128显示码值,>128显示对应信号?
ZSH提示符根据退出状态显示返回码或对应信号名
我刚好解决过类似的需求,其实不需要用precmd函数(你说的没错,precmd执行时会覆盖上一个命令的退出状态码,导致拿不到正确的值),直接在PROMPT里用ZSH自带的条件提示符语法就能实现通用的处理逻辑。
核心实现代码
直接把这段放到你的.zshrc里即可:
# 先加载颜色模块(如果需要颜色区分错误状态的话) autoload -U colors && colors # 配置提示符:退出码≤128显示数字,>128显示对应信号名 PROMPT='%{$fg[red]%}%($?>128.SIG$(kill -l $(( $? - 128 ))).$?)%{$reset_color%}> '
代码逻辑拆解
咱们一步步看这个提示符的工作原理:
- ZSH条件提示符语法:
%($?>128.XXX.YYY)是ZSH专为提示符设计的条件判断语法,规则很简单:- 如果上一个命令的退出码
$?>128为真,就显示XXX部分 - 否则显示
YYY部分
- 如果上一个命令的退出码
- 信号名转换:当退出码大于128时,说明命令是被信号终止的,真实的信号编号等于
$? - 128,用kill -l 信号编号就能把数字转成对应的信号名(比如130-128=2,对应SIGINT),前面加SIG是为了统一格式,更直观。 - 颜色优化:用
%{$fg[red]%}和%{$reset_color%}给错误状态加上红色,方便快速识别,不需要颜色的话可以直接去掉这两段。
效果验证
- 执行
false(退出码1):提示符显示1> - 按
Ctrl+C终止命令(退出码130):提示符显示SIGINT> - 用
kill -9终止后台进程(退出码137):提示符显示SIGKILL> - 执行
true(退出码0):提示符显示0>
为什么precmd会失败?
你之前遇到的问题确实是ZSH的机制导致的:precmd是在每个命令执行前自动运行的函数,它自身的退出状态会覆盖$?的值,所以在precmd里读取$?,拿到的是precmd自己的退出码,而不是上一个用户命令的退出码,这就是用precmd实现会失效的核心原因。
内容的提问来源于stack exchange,提问作者Minion Jim
相关产品推荐
相关产品推荐

