PS1中的条件空间

3

我基本上想要创建一个具有以下输出的PS1:

$ ~/Projects/Blah (master):

然而,如果我所在的文件夹不是Git仓库,我希望它显示如下:
$ ~/Projects/Blah:

这是我的当前PS1:

这是我的当前PS1:

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

当我在Git仓库中时,它可以给我想要的输出结果。但是当我在一个不在Git仓库中的文件夹中时,输出结果会像这样:
$ ~/Projects/Blah :

如果它不是Git仓库,我不想要那个空间。

我有办法在我的PS1中指定这个吗?


2
你能控制 __git_ps1 的输出吗?只需将空格移到那里即可。 - Andreas Louv
我有__git_ps1等于"git branch 2>/dev/null | grep '*' | sed 's/* \(.*\)/(\1)/'"。我尝试在不同的地方插入空格,但似乎没有起作用。对于那一行,我不太熟悉其中发生了什么,我相信这是从某个地方复制过来的。 - Saad
4个回答

4

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

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

2

我最终使用了这个.git-prompt.sh文件。以下是使其工作的步骤:

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

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

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

将您的__git_ps1更改为:

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

请注意在sed替换中(\1)前的额外空格。

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

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

无需使用 grep ... | sed -n 's/* \(.*\)/ (\1)/p' - Andreas Louv
@andlrc,我不是高级sed专家。你的命令会打印所有内容和当前分支两次。我认为你需要在s///p之后加上d - Dummy00001
你忘记设置 -n 标志了吗? - Andreas Louv
@andlrc,是的,我做了。已经测试并添加到答案中了。 - Dummy00001
-n 将默认禁用打印,替换(s///)后加上 p 将在替换成功时打印该行。您还可以像您指出的那样删除每一行并将所需行打印两次:... | sed 's/* \(.*\)/ (\1)/p;d' - Andreas Louv

0
准备像这样的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) 一样,两端都有空格;当 git_ps1 没有设置(非 git 目录)时,将返回一个完整的空字符串。现在,您可以使用 $git_ps1 变量将其插入到任何您想要的地方。

解释:

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

是一个条件变量赋值

  1. 如果设置了git_ps1,则它将等于(${git_ps1/#\* /}),否则它将保持为空。

  2. ${git_ps1/#\* /}$git_ps1的开头删除*和空格。


示例用法:

__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)}\[\033[00m\]\[\033[01;34m\]\w\[\033[00m\]$(__git_ps1) \[\033[1;32m\]>\[\033[00m\]\[\033[1;32m\]>\[\033[00m\]\[\033[1;32m\]>\[\033[00m\] '
else
    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi

这会给我一个类似于这样的提示: 在此输入图片描述

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接