__git_ps1如何更新 bash 提示?



我是一个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[41mRDPe[0m"
fi
echo "$MATCH"
}

所以这个想法是我想用红色背景显示 RDP,我希望我的 shell 以与__git__ps1似乎相同的方式动态评估它。

到目前为止,我调查了什么(没有真正的成功)

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

这个块似乎创建了我的外壳正在使用的 PS1

PS1='[33]0;$TITLEPREFIX:$PWD07]' # set window title
PS1="$PS1"'n'                 # new line
PS1="$PS1"'[33[32m]'       # change to green
PS1="$PS1"'u@h '             # user@host<space>
PS1="$PS1"'[33[35m]'       # change to purple
PS1="$PS1"'$MSYSTEM '          # show MSYSTEM
PS1="$PS1"'[33[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"'[33[36m]'  # change color to cyan

# 尝试干扰 PS1="$PS 1 '__rdp_ps1'"在这里,它仅适用于登录

PS1="$PS1"'`__git_ps1`'   # bash function
fi
fi
PS1="$PS1"'[33[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并且它始终处于打开状态,但我真的不知道这意味着什么,因为评论让我相信当登录环境关闭时,将评估提示脚本

有什么想法吗???

您的问题可能是您使用双引号定义$PS1,bash 在执行时会解释。这意味着在定义$PS1时运行__rdp_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 342234226 (${EXIT})"
else
PS1+="$Gre 342234224"
fi
PS1+="$RColn> "
}

.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 > 

不是直接的解决方案,但这可能会有所帮助:如果您想知道__git_ps1函数在文件系统上的本地位置,以便您可以尝试进行编辑,您可以这样做

grep -r __git_ps1 /

它在 Git Bash 的整个文件系统的文件内容中搜索字符串"__git_ps1"(/实际上是C:Program FilesGit的,或者你安装了它的任何位置)。

对我来说,这是/mingw64/share/git/completion/git-prompt.sh

我的用例是从分支名称中删除括号,我通过更改此行来做到这一点:

local printf_format=' (%s)'

__git_ps1 ()函数中

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

最新更新