Bash echo 颜色作为 PS1 中的函数输出

Bash echo 颜色作为 PS1 中的函数输出

我希望我的 PS1 显示(如果我在 git 文件夹中)分支,如果工作目录很脏,则将分支涂成红色,如果干净,则涂成蓝色。以下是我想到的

IBlack='\e[0;90m'       # Nero
IRed='\e[0;91m'         # Rosso
IGreen='\e[0;92m'       # Verde
IYellow='\e[0;93m'      # Giallo
IBlue='\e[0;94m'        # Blu
IPurple='\e[0;95m'      # Viola
ICyan='\e[0;96m'        # Ciano
IWhite='\e[0;97m'       # Bianco

parse_git_branch() {
    git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}
branch_color() {
    if git status | grep --quiet "nothing to commit"; then
        echo -e "$IBlue"
    else
        echo -e "$IRed"

    fi
}


PS1="\[$IGreen\]\u \[$ICyan\][\W]\[\$(branch_color)\]\$(parse_git_branch)\[$IWhite\] \n → "

现在,代码打印如下:

francesco [demo_app]\e[0;94m (master) 

在哪里弗朗西斯科是我的用户名,演示应用程序是文件夹和掌握是分支。序列\e[0;94分钟如果我在工作目录中创建一个文件,颜色就会发生变化,但正如您所见,颜色不会被解析。

然后我尝试像这样更改 PS1:

PS1="\[$IGreen\]\u \[$ICyan\][\W]\[$(branch_color)\]\$(parse_git_branch)\[$IWhite\] \n → "

删除 (branch_color) 之前的 '\',现在它可以解析颜色,但是当工作目录状态改变时它不会改变。

我该如何解决这个问题?如果我没有说清楚的话,请见谅。

弗朗西斯科

答案1

你的代码在我的 Debian 上完美运行。你的问题可能是 OSXecho无法正确打印转义序列。

通常最好避免echo使用,而改用printf,因为不同的系统有不同的echo实现,这可能会影响脚本的可移植性并导致其他问题。请参阅这里了解更多详细信息。

无论如何,尝试echo用 printf 替换函数中的 s:

branch_color() {
    if git status 2>/dev/null | grep --quiet "nothing to commit"; then
        printf "\e[0;94m"
    else
        printf "\e[0;91m"

    fi
}
PS1="\[$IGreen\]\u \[$ICyan\][\W]\[\$(branch_color)\]\$(parse_git_branch)\[$IWhite\] \n → "



PS1="\[$IGreen\]\u \[$ICyan\][\W]\[\$(branch_color)\]\$(parse_git_branch)\[$IWhite\] \n → "

相关内容