Информативные приглашения в bash

Как это выглядит

В данной статье я расскажу как настроить такое приглашение в терминале:

Скриншот терминала с PS1 из последнего раздела

Цвета

Шаблон приглашения хранится в переменной PS1 текущего окружения. Узнать ее текущее значение:

echo $PS1

Настраиваем красное приглашение для рута. Добавляем в /root/.bashrc

export PS1="\[\e[31;1m\]\u@\h \[\e[31;0m\e[33m\]\w# \[\e[0m\]"

Зеленое приглашение для остальных пользователей. Добавляем в ~/.bashrc

export PS1="\[\e[32;1m\]\u@\h \[\e[31;0m\e[32m\]\w \[\e[0m\]"

Перезапустить консоль либо сделать:

source ~/.bashrc

Для того, чтобы изменить цвета на свои, нужно менять цифры: 0, 1, 31, 33

Более подробно о настройке цветов здесь: http://habrahabr.ru/post/94647

Git в bash

Git умеет встраиваться в приглашение почти из коробки. Нужно вызвать функцию __git_ps1, чтобы получить информацию о текущем состоянии в скобках. Выглядит это примерно так (только в цветах):

cmx ~/projects/sample (master)

Оборачиваем в цвета и получаем строку:

__git_ps1 '\e[36;1m(%s)\e[31;0m\e[32m '

Теперь экранируем ее и вставляем в PS1 и получаем:

export PS1="\[\e[32;1m\]\u@\h \[\e[31;0m\e[32m\]\w \$(__git_ps1 '\[\e[36;1m\](%s)\[\e[31;0m\e[32m\] ')\[\e[0m\]"

Также у __git_ps1 есть дополнительные опции, включение которых позволяет выводить дополнительную информацию. Я оставил наиболее полезные из них:

  • “*” dirty state
  • ”%” untracked files
  • ”+” добавленные, но не закомиченные файлы

Для включения этих опций нужно присвоить переменным значения до вычисления PS1.

export GIT_PS1_SHOWDIRTYSTATE=1
export GIT_PS1_SHOWUNTRACKEDFILES=1
export GIT_PS1_DESCRIBE_STYLE=default

Полный список опций https://raw.githubusercontent.com/git/git/master/contrib/completion/git-prompt.sh

Результат

Мой финальный код в ~/.bashrc для PS1 выглядит так:

export GIT_PS1_SHOWDIRTYSTATE=1
export GIT_PS1_SHOWUNTRACKEDFILES=1
export GIT_PS1_DESCRIBE_STYLE=default
export PS1="\[\e[32;1m\]\u \[\e[31;0m\e[32m\]\w \$(__git_ps1 '\[\e[36;1m\](%s)\[\e[31;0m\e[32m\] ')\[\e[0m\]"

Я также убрал @\h при работе на локальной машине

Updated on Pavel Shorokhov