You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置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%}> '

代码逻辑拆解

咱们一步步看这个提示符的工作原理:

  1. ZSH条件提示符语法:%($?>128.XXX.YYY) 是ZSH专为提示符设计的条件判断语法,规则很简单:
    • 如果上一个命令的退出码$?>128为真,就显示XXX部分
    • 否则显示YYY部分
  2. 信号名转换:当退出码大于128时,说明命令是被信号终止的,真实的信号编号等于$? - 128,用kill -l 信号编号就能把数字转成对应的信号名(比如130-128=2,对应SIGINT),前面加SIG是为了统一格式,更直观。
  3. 颜色优化:用%{$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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 20:52:46