如何在.bashrc中清除$?变量的值?

3

我一直试图自定义我的bash提示符,使其看起来像这样:

┌─[error_code_if_not_zero][time_short][username][current_folder][git_branch]
└─▪ 

以下是我的.bashrc文件内容:

# command completion
source /home/falcon/.bin/git-prompt.sh

GIT_PS1_SHOWDIRTYSTATE=1
GIT_PS1_SHOWSTASHSTATE=1
GIT_PS1_SHOWUNTRACKEDFILES=1
GIT_PS1_SHOWUPSTREAM="auto"

# function to generate the prompt
function __prompt_command() {
    __exit_code="$?"
    __error_int="";
    if [ $__exit_code -ne 0 ]; then
        __error_int="[\[\e[0;31m\]$__exit_code\[\e[0;37m\]]─"
    fi

    PS1="\[\e[0;37m\]┌─$__error_int[\A]─[\[\e[0;35m\]\u\[\e[0;37m\]]─[\[\e[0;33m\]\w\[\e[0;37m\]]\$(__git_ps1 '─[\[\e[0;31m\]%s\[\e[0;37m\]]')\n\[\e[0;37m\]└─▪ \[\e[0;m\]"
}

export PROMPT_COMMAND=__prompt_command

这个配置很好用,当其非零时它会显示错误代码。但是问题出现在我只是在终端中按下enter(调用空命令)时 - 返回值仍然与上一个非空命令的返回值相同。例如,当我只是在终端中按下enter时就会发生这种情况:

┌─[127]─[02:51]─[falcon]─[~]
└─▪ 
┌─[127]─[02:51]─[falcon]─[~]
└─▪ 
┌─[127]─[02:51]─[falcon]─[~]
└─▪ 
┌─[127]─[02:51]─[falcon]─[~]
└─▪ 

正如您所看到的,即使是空命令,错误码127仍然存在。 但我期望像这样:
┌─[127]─[02:51]─[falcon]─[~]
└─▪ 
┌─[02:51]─[falcon]─[~]
└─▪ 
┌─[02:51]─[falcon]─[~]
└─▪ 
┌─[02:51]─[falcon]─[~]
└─▪ 

因此,我的问题是如何在函数__prompt_command内清空$?的值?

1
嗯,我花了很长时间来研究这个问题,但是没有解决方案。问题在于作用域——在标记为“可能重复”的问题中,变量在用户环境中设置,因此它会持续存在。在上面的问题中,PS1在每次需要提示时运行的函数内部设置。由于没有变量跨函数调用持久存在,我能想到的唯一解决方案涉及临时文件,这只是不切实际的。 :( - vastlysuperiorman
2个回答

1

我明白了。首先,要归功于anubhava,在提到的“检测空命令”问题中,他是这段代码的作者。

不过,就我所知,它按照你想要的方式工作。

# command completion
source /home/falcon/.bin/git-prompt.sh

GIT_PS1_SHOWDIRTYSTATE=1
GIT_PS1_SHOWSTASHSTATE=1
GIT_PS1_SHOWUNTRACKEDFILES=1
GIT_PS1_SHOWUPSTREAM="auto"

# function to generate the prompt
PS1="\[\e[0;37m\]┌─\$([[ -n \$_ret ]] && echo \"[\[\e[0;31m\]\$_ret\[\e[0;37m\]]-\")[\A]─[\[\e[0;32m\]\u\[\e[0;37m\]]─[\[\e[0;33m\]\w\[\e[0;37m\]]\$(__git_ps1 '─[\[\e[0;31m\]%s\[\e[0;37m\]]')\n\[\e[0;37m\]└─▪ \[\e[0;m\]"
trapDbg() {
   local c="$BASH_COMMAND"
   [[ "$c" != "pc" ]] && export _cmd="$c"
}

pc() {
   local r=$?
   if [[ $r == 0 ]]; then
      r=''
   fi
   trap "" DEBUG
   [[ -n "$_cmd" ]] && _ret="$r" || _ret=""
   export _ret
   export _cmd=
   trap 'trapDbg' DEBUG
}

export PROMPT_COMMAND=pc
trap 'trapDbg' DEBUG

我将您的代码与他的代码合并,并修改了PS1。现在它包括逻辑,只有在设置了$_ret时才显示方括号。此外,anubhava的代码总是显示返回代码,包括0。我添加了条件部分,在返回代码为0时取消设置。无论如何,这就是结果。
注意:我没有git-prompt.sh包含的任何内容,所以我在没有那一部分的情况下进行了测试。希望这不会对任何事情产生重大影响。

谢谢,这对我有用。git-prompt.sh 用于显示 git 分支。 - Chan Kha Vu

1
如果在使用$?值后,您将/bin/true作为函数的一部分“调用”,那么它应该始终将其设置为0。

是的,我之前尝试过在__error_int=...之后执行exec true这样的命令,但是当运行一个返回非零值的命令时,它会立即关闭我的终端。附言:我对bash不太熟悉,这是我第一次尝试构建arch linux。 - Chan Kha Vu
是的,我之前没有看过PROMPT_COMMAND,我敢肯定它会在子shell中调用命令,因此无法真正影响变量,比如父进程中的$?。虽然我不确定,但我认为情况就是这样。很抱歉我的答案在这方面毫无用处。 - Eric Renouf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接