为何Nushell闭包执行对应分支时仍返回空字符串?
解决Nushell自定义Git提示符在非仓库目录失效的问题
问题原因
原代码中in_git_repo函数的实现存在错误:当不在Git仓库目录时,git rev-parse --is-inside-work-tree会执行失败并返回非0退出码,Nushell会直接抛出错误,导致整个PROMPT_COMMAND闭包执行中断,无法生成自定义提示符,只能显示默认的尖括号。
修复步骤
1. 修复in_git_repo函数
改用command success?判断命令是否执行成功,避免捕获输出时的错误:
def in_git_repo [] { command success? git rev-parse --is-inside-work-tree err> /dev/null }
该命令在Git仓库内会执行成功并返回true,不在仓库时执行失败返回false,全程不会抛出错误。
2. 优化提示符拼接逻辑(可选)
原代码中目录~没有添加颜色,可以统一处理;同时简化拼接逻辑:
$env.PROMPT_COMMAND = { let time = (ansi green) + (date now | format date '%H:%M') + (ansi reset); let dir = if (pwd) == "/Users/redacted" { (ansi blue) + "~" + (ansi reset) } else { (ansi blue) + (pwd | path basename) + (ansi reset) } let git = if (in_git_repo) { "git" } else { "" } # 用数组拼接简化分支逻辑 let prompt_parts = [$time, $dir] if $git != "" { $prompt_parts | append $git | str join " " } else { $prompt_parts | str join " " } }
3. 调试技巧
如果需要调试提示符逻辑,可以临时将生成的内容保存到文件查看:
# 在PROMPT_COMMAND闭包末尾添加 $prompt_parts | str join " " | save ~/prompt_debug.txt
或者使用debug命令暂停并查看变量值:
debug $time
内容的提问来源于stack exchange,提问作者TheGnuGod
相关产品推荐
相关产品推荐

