我是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
并一直打开,但是我真的不知道这是什么意思,因为该注释使我相信关闭登录环境时,将对提示脚本进行评估
任何想法?
答案 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
。