Цвет эха 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 реализации и это может повлиять на переносимость ваших сценариев, а также вызвать другие проблемы. Смотрите здесь для (гораздо) более подробной информации.

В любом случае, попробуйте заменить echos в вашей функции с `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 → "
Другие вопросы по тегам