Цвет эха Bash как выход функции в 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)
→
где francesco - мое имя пользователя, demo_app - папка, а master - ветвь. последовательность \e[0;94m изменяется, если я создаю файл в рабочем каталоге, но цвет не анализируется, как вы можете видеть.
Затем я попытался изменить PS1 следующим образом:
PS1="\[$IGreen\]\u \[$ICyan\][\W]\[$(branch_color)\]\$(parse_git_branch)\[$IWhite\] \n → "
удаляя '\' раньше (branch_color), и теперь он анализирует цвет, но не изменяется при изменении статуса рабочего каталога.
Как я могу решить это? Извините, если мне было не ясно.
Francesco
1 ответ
Код, который у вас есть, отлично работает на моем Debian. Ваша проблема может быть в том, что OSX echo
неправильно печатает escape-последовательность.
Как правило, лучше избегать echo
и использовать printf
вместо этого, поскольку разные системы имеют разные echo
реализации и это может повлиять на переносимость ваших сценариев, а также вызвать другие проблемы. Смотрите здесь для (гораздо) более подробной информации.
В любом случае, попробуйте заменить echo
s в вашей функции с `printf:
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 → "