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


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]dt$nu->(`get_git_branch`)`exit_status`:'

这是我的bashrc中的PS1设置,我想在我的终端中检查git分支和退出状态,每次PS1刷新时get_git_branch都能工作,但exit_status没有,为什么exit_status不执行?

它绝对被执行。但是,$?会被之前运行的其他代码更改,比如get_git_branch

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

get_git_branch(){
  local branch
  if branch=$(git rev-parse --abbrev-ref HEAD 2>/dev/null); then
    printf '%sn' "${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]dt$nu->($(get_git_branch))$(exit_status "$last_exit_status_"):'
}
PROMPT_COMMAND=build_prompt

最新更新