zsh主题中传递%?给脚本失败,如何正确传递上次退出码?
Zsh主题中正确传递命令退出码给外部脚本的解决方法
方法一:利用precmd钩子保存真实退出码
zsh的precmd函数会在每次生成提示符之前执行,此时获取的$?就是上一条命令的真实退出码,不会被其他中间命令干扰。
在你的zsh主题文件或.zshrc中添加以下配置:
# 先加载hook模块(若主题未默认加载) autoload -Uz add-zsh-hook # 定义precmd钩子函数保存退出码 _save_exit_code() { LAST_EXIT_CODE=$? } add-zsh-hook precmd _save_exit_code # 在PROMPT中使用保存的变量调用脚本 PROMPT='$(python "$ZSH/custom/plugins/exit-code.py" "$LAST_EXIT_CODE") 你的提示符内容'
方法二:强制展开%?提示符转义
zsh的命令替换($())里默认不会解析%?这类提示符转义符,需要用参数展开语法强制解析:
PROMPT='$(python "$ZSH/custom/plugins/exit-code.py" "${(%):-%?}") 你的提示符内容'
这里${(%):-%?}的作用是告诉zsh对%?进行提示符转义处理,将其替换为实际的退出码数字,而非字符串%?。
额外注意事项
- 确保
exit-code.py能正确处理整数参数,包括退出码为0(命令执行成功)的情况,避免出现类型转换报错。 - 若使用Oh My Zsh,建议将配置放在自定义主题文件(
$ZSH/custom/themes/下的文件)中,防止被默认配置覆盖。
内容的提问来源于stack exchange,提问作者alexZeLoCO
相关产品推荐
相关产品推荐

