【问题标题】:How to empty the value of $? variable in .bashrc? [duplicate]如何清空$的值? .bashrc 中的变量? [复制]
【发布时间】:2015-04-15 23:57:16
【问题描述】:

我一直在尝试自定义我的 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]─[~]
└─▪ 

如您所见,error code 127 即使在一个空命令之后仍然存在。 但我期待这样的事情:

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

那么,我的问题是,如何在函数__prompt_command 中清空$? 的值?

【问题讨论】:

  • 好吧,我已经花了很长时间看这个,但没有解决方案。问题在于范围——在标记的“可能重复”中,在 users 环境中设置了一个变量,因此它仍然存在。在上面的问题中,PS1 设置在 function 中,每次需要提示时都会运行该函数。由于对函数的调用没有变量持续存在,因此我能想到的唯一解决方案涉及临时文件,这是不切实际的。 :(

标签: bash ps1


【解决方案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时添加了条件位unset。

无论如何,你有它。

注意:我没有 git-prompt.sh 包含的任何内容,所以我在没有那个位的情况下进行了测试。希望这不会彻底改变任何事情。

【讨论】:

  • 谢谢,这对我有用。 git-prompt.sh 用于显示 git 分支。
【解决方案2】:

如果您在使用 $ 之后“调用”/bin/true 作为函数的一部分会怎样?值,应始终将其设置为 0

【讨论】:

  • 是的,我之前在__error_int=... 之后尝试过类似exec true 的操作,但它只是在运行返回非零值的命令后立即关闭我的终端。 PS:我对 bash 还很陌生,这是我第一次尝试构建 arch linux。
  • 是的,在此之前我没有看过 PROMPT_COMMAND,我确信它在子 shell 中调用命令,所以它实际上不可能影响变量,比如@987654324 @ 在父级中。我不是 100% 相信这一点,但我敢打赌就是这样。抱歉,我的回答似乎对此毫无用处。
猜你喜欢
  • 2012-07-08
  • 1970-01-01
  • 2011-07-08
  • 1970-01-01
  • 2019-11-03
  • 1970-01-01
  • 1970-01-01
  • 2015-10-16
  • 1970-01-01
相关资源
最近更新 更多