Shell 为什么我的函数不在PS1中执行?

Shell 为什么我的函数不在PS1中执行?,shell,ps1,Shell,Ps1,这是我的bashrc中的PS1设置,我想在我的终端中检查git分支和退出状态,每次PS1刷新时让git分支工作,但退出状态未执行,退出状态未执行?它绝对已执行。但是,$?会被之前运行的其他代码更改,比如get\u git\u branch 这里的最佳实践不是在PS1中需要详细流控制的地方嵌入代码,而是使用PROMPT\u命令 get_git_branch(){ local branch__= git branch &> /dev/null

这是我的bashrc中的PS1设置,我想在我的终端中检查git分支和退出状态,每次PS1刷新时让git分支工作,但退出状态未执行,退出状态未执行?

它绝对已执行。但是,
$?
会被之前运行的其他代码更改,比如
get\u git\u branch

这里的最佳实践不是在PS1中需要详细流控制的地方嵌入代码,而是使用
PROMPT\u命令

get_git_branch(){
        local branch__=

        git branch &> /dev/null

        if [ $? -eq 0 ]; then
                branch__=`git branch --no-color | sed -ne 's/^\* \(.*\)$/\1/1p' | tr a-z A-Z`
        else
                branch__="NORMAL"
        fi
        echo -n $branch__
}

exit_status(){
        local smile__=
        if [ $? -eq 0 ]; then
                smile__='(*´▽`*)'
        else
                smile__='(╥﹏╥)'
        fi
        echo -n $smile__
}

export PS1='[\w]\d\t\$\n\u->(`get_git_branch`)`exit_status`:'

您不应该导出
PS1
——它是一个局部shell变量;没有任何理由把它的值放在子流程的环境中。顺便说一句,为什么
\uuu
s?您将这些声明为本地的,因此不必担心名称空间冲突。而且,
echo-n
——命令替换的结果会删除尾随的换行符。(另外,
echo
在任何非平凡的用例中都是不推荐的,包括所有带有标志的用例;请参阅,特别是应用程序用法和基本原理部分)。此外,几乎可以肯定的是,可以使用shell内置功能替换
sed
tr
代码,这将更加高效;然而,现在已经很晚了,我不太想弄清楚你在写这篇文章时想做什么。
${foo,,}
用小写字母展开
“$foo”
${foo^^}
以所有大写字母展开
$foo
。也不缺少其他内置的字符串操作;请参阅我的最后一个问题${1:-$?}的含义是什么?有关参数扩展的文档,请参阅或。这个特别的词的意思是“如果设置了,则使用
$1
,否则
$?
”。
get_git_branch(){
  local branch

  if branch=$(git rev-parse --abbrev-ref HEAD 2>/dev/null); then
    printf '%s\n' "${branch^^}" # if on bash 3.2, you may need to use tr instead
  else
    echo "NORMAL"
  fi
}

exit_status(){
  if (( ${1:-$?} == 0 )); then
    printf '%s' '(*´▽`*)'
  else
    printf '%s' '(╥﹏╥)'
  fi
}

build_prompt() {
  last_exit_status_=$?
  PS1='[\w]\d\t\$\n\u->($(get_git_branch))$(exit_status "$last_exit_status_"):'
}

PROMPT_COMMAND=build_prompt