__git_ps1如何更新bash提示?

时间:2019-05-31 20:50:30

标签: bash git shell

我是Windows用户,以Git Bash shell作为日常驱动程序。我很好奇__git_ps1函数如何在每次更改目录时更新提示。实际上,这是我所看到的动态更新bash提示的唯一示例。如果要打开RDP会话,我想在自己的函数中利用此行为在提示符下添加显示。

tldr :关于__git_ps1函数如何动态评估bash提示的任何想法吗??

这是我的简单函数,用于查看RDP客户端是否正在运行

function __rdp_ps1() {
  local MATCH=
  if tasklist | grep --quiet mstsc; then
    MATCH="\e[41mRDP\e[0m"
  fi
  echo "$MATCH"
}

因此,我的想法是我要以红色背景显示RDP,并且我希望我的shell能够以__git__ps1似乎可以的方式即时对其进行评估。

到目前为止我调查的内容(没有真正的成功)

/etc/profile.d/git-prompt.sh

此块似乎可以创建我的外壳正在使用的PS1

    PS1='\[\033]0;$TITLEPREFIX:$PWD\007\]' # set window title
    PS1="$PS1"'\n'                 # new line
    PS1="$PS1"'\[\033[32m\]'       # change to green
    PS1="$PS1"'\u@\h '             # user@host<space>
    PS1="$PS1"'\[\033[35m\]'       # change to purple
    PS1="$PS1"'$MSYSTEM '          # show MSYSTEM
    PS1="$PS1"'\[\033[33m\]'       # change to brownish yellow
    PS1="$PS1"'\w'                 # current working directory
    if test -z "$WINELOADERNOEXEC"
    then
        GIT_EXEC_PATH="$(git --exec-path 2>/dev/null)"
        COMPLETION_PATH="${GIT_EXEC_PATH%/libexec/git-core}"
        COMPLETION_PATH="${COMPLETION_PATH%/lib/git-core}"
        COMPLETION_PATH="$COMPLETION_PATH/share/git/completion"
        if test -f "$COMPLETION_PATH/git-prompt.sh"
        then
            . "$COMPLETION_PATH/git-completion.bash"
            . "$COMPLETION_PATH/git-prompt.sh"
            PS1="$PS1"'\[\033[36m\]'  # change color to cyan

#在此处尝试对PS1 =“ $ PS1`__rdp_ps1`”进行干扰,仅在登录时有效

            PS1="$PS1"'`__git_ps1`'   # bash function
        fi
    fi
    PS1="$PS1"'\[\033[0m\]'        # change color
    PS1="$PS1"'\n'                 # new line
    PS1="$PS1"'$ '                 # prompt: always $

所以我去看看这个文件的来源,看看是否可以找到答案

/etc/bash.bashrc

最后一行持有黄金

# Fixup git-bash in non login env
shopt -q login_shell || . /etc/profile.d/git-prompt.sh`

所以我评估了shopt login_shell并一直打开,但是我真的不知道这是什么意思,因为该注释使我相信关闭登录环境时,将对提示脚本进行评估

任何想法?

2 个答案:

答案 0 :(得分:1)

您的问题可能是您用双引号定义了$PS1,bash会在执行时将其解释。这意味着在定义__rdp_ps1时运行$PS1

在您的.bashrc中,尝试将定义替换为:

PS1='$PS1 `__rdp_ps1`' # Note the single quote. 

我在PS1上具有类似的功能(但要在后台显示作业数量),这是完整版(可在此处使用:https://github.com/padawin/dotfiles/blob/master/.bashrc#L70):

function j(){
    jobs | wc -l | egrep -v ^0 | sed -r 's/^([0-9]+)/ (\1)/'
}

PROMPT_COMMAND=__prompt_command # Func to gen PS1 after CMDs

__prompt_command() {
    local EXIT="$?" # This needs to be first
    PS1="$(virtual_env_name)"

    local RCol='\[\e[0m\]'

    local Red='\e[0;31m'
    local Gre='\e[0;32m'
    local Blu='\e[1;34m'

    PS1+="${Gre}\u@\h$(j)${RCol}: ${Red}\w${Blu}$(__git_ps1)"
    if [ $EXIT != 0 ]; then
        PS1+="$Red \342\234\226 (${EXIT})"
    else
        PS1+="$Gre \342\234\224"
    fi
    PS1+="$RCol\n> "
}

.bashrc中可以简化为以下内容:

function j(){
    jobs | wc -l | egrep -v ^0 | sed -r 's/^([0-9]+)/ (\1)/'
}

PS1='\u$(j) > ' # Note the single quote here

其行为如下:

padawin > vim

[1]+  Stopped                 vim
padawin (1) > fg
vim
padawin > 

答案 1 :(得分:0)

您要寻找的是PROMPT_COMMAND。 Bash将在显示提示之前执行其中的任何内容。如果您的PS1正在即时更新,则您可能已经有了PROMPT_COMMAND