我希望我的 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 → "