如何阻止bash提示颜色转义

我正在尝试配置bash以显示当前的git分支,基于此处的示例 ,但我无法弄清楚如何让bash停止转义颜色字符串。 我尝试的所有内容都会导致在提示行中输出颜色字符串。

我的提示如下:

valorin@gandalf:~/workspace/wyoa (\[\033[0;31m\]master\[\033[00m\])$ 

.bashrc的相关部分:

 ## # Custom Git Branch name in prompt ## function git_prompt { if ! git rev-parse --git-dir > /dev/null 2>&1; then return 0 fi git_branch=$(git branch 2>/dev/null| sed -n '/^\*/s/^\* //p') if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then if git diff --quiet 2>/dev/null >&2; then echo " (\[\033[0;31m\]$git_branch\[\033[00m\])" else echo " (\[\033[0;33m\]$git_branch\[\033[00m\])" fi else if git diff --quiet 2>/dev/null >&2; then echo " ($git_branch)" else echo "($git_branch*)" fi fi } if [ "$color_prompt" = yes ]; then PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]$(git_prompt)$ ' else PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w$(git_prompt)\$ ' fi 

任何帮助,将不胜感激。

在bash提示符下,您不能拥有同时输出文本和颜色的函数。 function输出的所有内容都是字面意思。 我建议以不同的方式进行。

首先,提示尝试执行的操作是检查您是否在git树中,如果是,请在提示符处添加彩色(分支)。 每次更改目录时,您实际上只需要执行该检查,而不是每次更改目录时都需要检查,因此我们可以覆盖只有三个可以更改目录的命令,将变量git_branch设置为当前分支的名称(如果有)。

 cd() { builtin cd "$@" || return git_branch=$(git branch 2>/dev/null|sed -n '/^[*] /s///p') || true } pushd() { builtin pushd "$@" || return git_branch=$(git branch 2>/dev/null|sed -n '/^[*] /s///p') || true } popd() { builtin popd "$@" || return git_branch=$(git branch 2>/dev/null|sed -n '/^[*] /s///p') || true } 

接下来,检查stderr是否是终端,并使用tput设置颜色

 user_color= dir_color= git_color= reset= if [[ -t 2 ]]; then user_color=$(tput setaf 2; tput bold) dir_color=$(tput setaf 4; tput bold) reset=$(tput sgr0) fi 

并且function根据是否有变化输出两种颜色中的一种

 _git_color() { [[ $git_branch && -t 2 ]] || return if git diff --quiet >/dev/null 2>&1; then tput setaf 1 else tput setaf 3 fi } 

现在,把提示放在一起。 这有点麻烦,因为一些变量应该在赋值(现在)时扩展,而有些变量应该在打印提示时展开,所以我们需要替换引号,加上它变得相当长。 为此使用数组应该有助于保持概述

 prompt=( "\[$user_color\]" '\u@\h' "\[$reset\]" : "\[$dir_color\]" '\w' "\[$reset\]" '${git_branch:+ (}' '\[$(_git_color)\]' '$git_branch' "\[$reset\]" '${git_branch:+)}' '\$ ' ) 

我在这里省略了debian_chroot的东西,我自己从来不需要它,你当然可以添加它,如果你想要的话。 最后,加入提示数组并清理我们不再需要的变量。

 printf -v PS1 %s "${prompt[@]}" unset user_color dir_color reset prompt