Создание командной строки Bash с красным $ после сбоя предыдущей команды - PullRequest
4 голосов
/ 21 августа 2011

Я новичок в программировании на Bash и работаю над созданием настраиваемой командной строки Bash .Моя цель - создать приглашение, в котором будут отображаться только имя входа и имя хоста, если они отличаются от тех, которые я обычно использую.Я также хочу добавить текущую ветку Git в командную строку, когда в каталоге, который находится под контролем версии Git.

Я хотел бы покрасить раздел логина и имени хоста в зеленый, путь к каталогу синий,раздел ветки Git розовый, а разделители (: и символы $) белые.Однако, , когда ранее выполненная команда возвращает что-либо кроме нуля, я хотел бы покрасить $ separator красным .Общий формат без цветов выглядит следующим образом:

loginname@hostname:~/current/path:branchname$

Обязательными являются только разделы: путь к каталогу и символ $.Вот код, который я написал для моего .bashrc файла:

MYNAME="gwen"
MYHOST="gwen-laptop"

RED="\[\033[31m\]"
WHITE="\[\033[0m\]"
GREEN="\[\033[01;32m\]"
BLUE="\[\033[01;34m\]"
PINK="\[\033[01;35m\]"

DOLLAR="if [ \$? = 0 ]; then echo ${WHITE}\$; else echo ${RED}\$${NORMAL}; fi"
GITBRN='$(__git_ps1 "\033[0m:\033[01;35m%s")'

USERNM="if [ \u != ${MYNAME} ]; then whoami; fi;"
HOSTNM="if [ \h != ${MYHOST} ]; then echo -n @; hostname; fi;"
COLONM="if [ \u != ${MYNAME} ] || [ \h != ${MYHOST} ]; then echo -n :; fi;"

PS1="${GREEN}\`${USERNM}\`\`${HOSTNM}\`${WHITE}\`${COLONM}\`${BLUE}\w${GITBRN}\`${DOLLAR}\` "

Этот код отвечает всем моим требованиям, за исключением того, что он всегда оставляет символ $ белыми не окрашивает его в красный цвет в соответствующее время .(Я подозреваю, что проблема в том, что «\ $?» В DOLLAR ссылается на ранее выполненную команду, но DOLLAR выполняется последним при построении PS1, поэтому ранее выполненный оператор больше не является командой, которая была запущена до начала строительства PS1; это что-токоторый был выполнен для создания командной строки.) Я не уверен, как решить эту проблему .

Этот код уродлив, и нуждается в рефакторинге ,Я пытался переместить все цветовые коды в их собственные переменные, но когда я использовал эти цветовые переменные в коде для GITBRN, все пошло наперекосяк, поэтому я вместо этого использовал там буквальные цвета.

Я потратил целый день на то, чтобы заставить этот код работать, и я думаю, что сейчас я никуда не пойду.Любые предложения о том, как сделать так, чтобы этот знак доллара окрашивался красным в подходящее время, были бы наиболее признательны .Я также открыт для предложения по рефакторингу кода, чтобы сделать его более понятным и читаемым.

PS Я пользователь Ubuntu Linux (Lucid Lynx).

Ответы [ 3 ]

4 голосов
/ 21 августа 2011

Используйте переменную PROMPT_COMMAND, которая выполняется перед каждым основным приглашением в соответствии с man-страницей bash.

Например (пока это не работает, я пытаюсь заставить его работать правильно,но я думаю, что это возможно):

PROMPT_COMMAND="if [ \$? = 0 ]; then DOLLAR="${WHITE}\$${NORMAL}"; else DOLLAR="${RED}\$${NORMAL}"; fi"

Редактировать: из-за неудовлетворенности выполнением команд и непечатаемых символов внутри PS1 (иногда \[ и \]распечатывается буквально, а не используется как подсказка для PS1), я придумал это (замените ... на то, что вы хотите в вашем приглашении):

PROMPT_COMMAND='if [ $? = 0 ]; then DOLLAR_COLOR="\033[0m"; else DOLLAR_COLOR="\033[31m"; fi'
PS1='...\[$(echo -ne $DOLLAR_COLOR)\]$\[\033[m\] '

Конечно, используя $(), вы можете поместить любые части этого, которые вам нравятся, внутри PS1 вместо PROMPT_COMMAND, мне просто так нравится, что PROMPT_COMMAND содержит логику, а PS1 содержиткоманды дисплея.

2 голосов
/ 21 августа 2011

Я получил его на работу:

PROMPT_COMMAND='if [ $? = 0 ]; then PS1="\[\e[32;1m\]\u@\[\e[0m\e[30;47m\]\H\[\e[0m\]:\[\e[34;1m\]\w\[\e[0m\]$ "; else PS1="\[\e[31;1m\]\u@\[\e[0m\e[31;47m\]\H\[\e[0m\]:\[\e[31;1m\]\w\[\e[0m\]$ "; fi'

enter image description here

Стоя на плечах @jtbandes. @jtbandes - оригинальный автор идеи.

1 голос
/ 06 июня 2016

Здесь Ответ Александра изменен, чтобы отображать красный цвет только при сбое команды, а не при нажатии клавиши ввода в пустой командной строке, как просил Стефан.

...