Как помешать выводу цветов 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
Любая помощь будет оценена.
1 ответ
Вы не можете иметь функцию, которая выводит как текст, так и цвет, в приглашении bash. Все, что выводит функция, воспринимается буквально. Я предлагаю пойти по-другому.
Прежде всего, то, что пытается сделать подсказка, это проверить, находится ли вы в 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
И функция, которая выводит один из двух цветов в зависимости от того, есть изменения или нет
_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