PS1 中的条件 space

Conditional space in PS1

我基本上是在尝试创建一个具有以下输出的 PS1:

$ ~/Projects/Blah (master):

但是,如果我所在的文件夹不是 Git 存储库,我希望它看起来像这样:

$ ~/Projects/Blah:

这是我现在的 PS1:

export PS1="$ \w $(__git_ps1): "

当我在 Git 存储库中时,它会给我想要的输出,但是当我在不在 Git 存储库中的文件夹中时,输出看起来像这个:

$ ~/Projects/Blah :

如果 space 不是 Git 存储库,我真的不想要它。

有什么方法可以在 PS1 中指定吗?

export PS1="$ \w $(__git_ps1): "

I have __git_ps1 equal to git branch 2>/dev/null | grep '*' | sed 's/* \(.*\)/()/'.

将您的 __git_ps1 更改为:

git branch 2>/dev/null | grep '*' | sed 's/* \(.*\)/ ()/'

注意 () 之前的 sed 替换中额外的白色-space。

Edit1:@andlrc 简化了 __git_ps1,少了一个命令:

__git_ps1() { git branch 2>/dev/null | sed -n 's/\* \(.*\)/ ()/p'; }

我最终使用了这个 .git-prompt.sh 文件。让它工作的步骤:

  1. 在您的主目录 (~/.git-prompt.sh) 中创建一个名为 .git-prompt.sh 的文件,并将上面 link 中的代码复制到其中。
  2. 在您的 .bash_profile.bashrc 文件中,添加此行:source ~/.git-prompt.sh
  3. 将您的 PS1 更改为:PS1='\n$ \w$(__git_ps1 " (%s)"): '

像这样准备git_ps1

git_ps1=$(git branch 2>/dev/null | grep '*')
git_ps1="${git_ps1:+ (${git_ps1/#\* /}) }"
##                  ^space             ^space
## Change the spaces if you like it other ways.

git_ps1会像(master)一样,两端都是space;以及未设置 git_ps1 时的完整空字符串(对于非 git 目录)。现在您可以使用 $git_ps1 变量将其插入到您喜欢的任何位置。

解释:

git_ps1="${git_ps1:+ (${git_ps1/#\* /}) }"

是一个条件变量赋值

  1. 如果设置git_ps1则等于(${git_ps1/#\* /}),否则为空

  2. ${git_ps1/#\* /}$git_ps1

  3. 的开头删除 * 和 space


用法示例:

__git_ps1(){
    git_ps1=$(git branch 2>/dev/null | grep '*')
    git_ps1="${git_ps1:+ (${git_ps1/#\* /})}"
    echo "$git_ps1"
}
if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[3[00m\]\[3[01;34m\]\w\[3[00m\]$(__git_ps1) \[3[1;32m\]>\[3[00m\]\[3[1;32m\]>\[3[00m\]\[3[1;32m\]>\[3[00m\] '
else
    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w$ '
fi

这给了我这样的提示:

使用 PROMPT_COMMAND 逐段构建提示通常要简单得多,这是在显示每个提示之前执行的代码。 (顺便说一下,PS1 不需要导出。)

build_prompt () {
    PS1="$ \w"
    git_info=$(__git_ps1)
    if [[ $git_info ]]; then
        PS1+=" $git_info"
    fi
    PS1+=": "
}
PROMPT_COMMAND=build_prompt