根据上一个命令的退出状态设置提示符颜色

编程语言 2026-07-08

我正尝试根据上一次命令的状态来设置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 或 0 的提示符

然而,我希望提示符的颜色能够根据状态来变化;也就是说,上图中的“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}%#\ "

但我得到的只是:

颜色化的提示符,1 和 0 都为绿色

正如图中所示,颜色没有变化,尽管状态已经正确显示。据我所知,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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章