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
文件。让它工作的步骤:
- 在您的主目录 (
~/.git-prompt.sh
) 中创建一个名为 .git-prompt.sh
的文件,并将上面 link 中的代码复制到其中。
- 在您的
.bash_profile
或 .bashrc
文件中,添加此行:source ~/.git-prompt.sh
- 将您的 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/#\* /}) }"
是一个条件变量赋值。
如果设置git_ps1
则等于(${git_ps1/#\* /})
,否则为空
${git_ps1/#\* /}
从 $git_ps1
的开头删除 *
和 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
我基本上是在尝试创建一个具有以下输出的 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
文件。让它工作的步骤:
- 在您的主目录 (
~/.git-prompt.sh
) 中创建一个名为.git-prompt.sh
的文件,并将上面 link 中的代码复制到其中。 - 在您的
.bash_profile
或.bashrc
文件中,添加此行:source ~/.git-prompt.sh
- 将您的 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/#\* /}) }"
是一个条件变量赋值。
如果设置
git_ps1
则等于(${git_ps1/#\* /})
,否则为空${git_ps1/#\* /}
从$git_ps1
的开头删除
*
和 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