BASH:如何在 PS1 中保存退出代码以便稍后在 PS1 中使用?

BASH:如何在 PS1 中保存退出代码以便稍后在 PS1 中使用?

我正在尝试通过以下方式自定义我的 PS1(我已删除颜色):

PS1='\u@\h:\w$(git_branch)$(useExitCode)\$ '

在哪里

git_branch()
{
    git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'
}

至于退出状态,我想捡起来git_branch函数被执行,并在 中使用它useExitCode。我怎样才能做到这一点?后一个函数可能如下所示:

useExitCode()
{
    local exitCode=${1}

    if [[ ${exitCode} == 0 ]]; then
        echo ':)'
    else
        echo ':('
    fi
}

问题是,如何将退出代码存储在 PS1 中并在以后使用?

像下面这样的东西不起作用,但给出了总体方向的想法:

PS1='exitCode=$?\u@\h:\w$(git_branch)$(useExitCode ${exitCode})\$ '

上面的 echo 是“exitCode=0”(或=1)部分,但它没有被存储,因此在稍后调用“${exitCode}”时它是空的。

答案1

我会PROMPT_COMMAND为此使用变量:

PROMPT_COMMAND='lstatus=$?'
PS1='$(false)$(exit 3)<$lstatus> '

<0> sh -c 'exit 17'
<17> echo $?
17
<0>

bash(1)联机帮助页:

PROMPT_COMMAND 如果设置,则该值作为命令执行事先的发出每个主要提示。

答案2

我对提示符做了类似的操作,以下是我如何进行“git在提示符中获取分支,同时仍显示最后一个命令的退出代码”的操作:

 parse_git_branch() {
     exit_code=$?
     local stdcolor
     local branchcolor
     local lines
     stdcolor="^[[0;32m"
     if [[ -d ./.git ]] || $( git status > /dev/null 2>&1 ); then
        lines=$(git status -s | wc -l)
        if [[ 0 -eq ${lines} ]]; then
           # Working copy is clean
           branchcolor="^[[1;32m"
        elif git status -s 2> /dev/null | grep -q '^A'; then
           # If we have staged commits waiting, red; else yellow
           branchcolor="^[[1;31m"
        else
           branchcolor="^[[1;33m"
        fi
        git branch 2> /dev/null | sed -e '/^[^*]/d' -e "s/* \(.*\)/ $stdcolor($branchcolor\1$stdcolor)/"
     fi
     return $exit_code
  }
  export PS1='\[\e]0;\u@\h: \w\a\]\[\e[38;5;14m\]\u\[\e[38;5;8m\]@\[\e[38;5;6m\]\h\[\e[38;5;8m\]:\[\e[38;5;10m\]\w'"\$(parse_git_branch) \e[31m\${?##0}\n"'\[\e[$(((($?>0))*31))m\]\$\[\e[0m\] '

(经过清理的)结果提示及其在工作区中的外观git

me@host:~/src/project (devel)
$ false
me@host:~/src/project (devel)  1
$ true
me@host:~/src/project (devel) 
$

所有这一切的结果是:

  • 如果我在git工作区中,则会显示我当前的分支。绿色表示干净,黄色表示脏,红色表示有暂存文件等待提交
  • 如果最后一个命令的退出代码非零,则会在提示中显示(以红色),并且我仍然可以访问$?.

相关内容