根据上一个命令的退出状态设置提示符颜色
我正尝试根据上一次命令的状态来设置tcsh的提示符,该状态由 $status 给出,但在管理这件事时遇到了困难。
显示状态本身并不困难;下面给出一个最小工作示例(MWE),大致是这样的:
# Assume colors have been defined before this.
if ( $?prompt ) then
set divider="${white}|"
set end="%{\033[0;0m%}" # This is needed at the end
set prompt = "%?${divider}${end}%#\ "
endif
结果看起来是这样的:

然而,我希望提示符的颜色能够根据状态来变化;也就是说,上图中的“1”会变成红色,而只有零才会呈现为绿色。直接在 set prompt 上实现这一点从一开始就不可行,因此我一直在尝试使用 precmd 别名,但至今无果。我目前所做的如下:
if ( $?prompt ) then
set divider="${white}|"
set end="%{\033[0;0m%}" # This is needed at the end
alias precmd 'source prompt.csh'
endif
以及
#!/usr/bin/tcsh -f
if ( $? != 0 ) then
set p_status="${red}%?"
else
set p_status="${green}%?"
endif
set prompt = "${p_status}${divider}${p_hist} ${white}%#\ "
但我得到的只是:

正如图中所示,颜色没有变化,尽管状态已经正确显示。据我所知,if .. else .. endif 看起来似乎也无法正确解析 $? 或 $status。我还尝试过类似的做法,例如:
if ( $?status ) then
set _last = $status
if ( $_last != 0) then
set p_last="${red}%?"
else
set p_last="${green}%?"
endif
endif
也没有效果。我到底还缺少什么?
解决方案
看来 $? 变量没有被正确传递。把下面这两行添加到 prompt.csh 的顶部,然后自己试试看:
#!/usr/bin/tcsh -f
set exit_code=$?
echo "hello, exit code is $exit_code, ayo?"
if ( $? != 0 ) then
set p_status="${red}%?"
# ....
我认为你应该把 $? 作为参数传给脚本,像这样:
alias precmd 'source prompt.csh $?'
然后在你的 prompt.csh 中引用它:
#!/usr/bin/tcsh -f
if ( $1 != 0 ) then
set p_status="${red}%?"
else
set p_status="${green}%?"
endif
set prompt = "${p_status}${divider}${p_hist} ${white}%#\ "
免责声明:我不是tcsh专家,这在我测试时是可行的,但也可能踩坑。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。