Цвет эха Bash как выход функции в PS1

969
Francesco Zaffaroni

Я хочу, чтобы мой 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

0
Ой, извините, ошибка в мозге, я не должен отвечать на вопросы так поздно ... Я удалил свой ответ, поскольку он действительно был точно таким же, но `\ e [0; 94m (master)`, вероятно, был из-за синтаксической ошибки, Копирование, вставив ваш точный код, прекрасно работает в моей системе. terdon 10 лет назад 0
Какая у вас система? потому что по моему все еще не работает. он выводит цвет в виде строки в приглашении вместо его анализа (я на OSX 10.9.1) Francesco Zaffaroni 10 лет назад 0
Ах, я на Linux. Это может быть разница в реализации `echo`,` printf` имеет тенденцию быть [более безопасным] (http://unix.stackexchange.com/q/65803/22222). Попробуйте заменить два эхо-вызова в `branch_color ()` на `printf" \ e [0; 94m "` и `printf" \ e [0; 91m "` terdon 10 лет назад 0
Маан, который работал! благодарю вас! (опубликуйте как ответ, чтобы я мог назначить его) Francesco Zaffaroni 10 лет назад 0
Большой! Я отправил ответ. terdon 10 лет назад 0

1 ответ на вопрос

0
terdon

Код, который у вас есть, отлично работает на моем 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 → " 
Отлично, выбрал ответ, ты Francesco Zaffaroni 10 лет назад 0