настройка bash PS1

9

Я пытаюсь сделать PS1 настроенным следующим образом.

Зеленый = "\ [\ е [32; 1м \]"
Красный = "\ е [0; 31m"
Фиолетовый = "\ е [0; 35m"
STARTCOLOR = "\ [\ е [40m \]"
ENDCOLOR = "\ [\ е [0м \]"
export PS1 = "$ STARTCOLOR $ Green \ u @ $ Purple \ h $ Red \ w $ Green> $ ENDCOLOR"

И у меня есть несколько вопросов.

  • В чем разница между "[\ e [32; 1m]" и \ e [32; 1m "? Они одинаковые?
  • После запуска команды «export PS1» она работает хорошо, но когда я ввожу около 20 символов, символы перезаписываются, как я прикрепил. Что с этим не так?
  • Что означает STARTCOLOR (\ e [40m) / ENDCOLOR (\ e [0m)?

http://a.imageshack.us/img8/606/resultqm.jpg

ADDED

После некоторых тестов я получил следующее изменение, которое может решить проблему. То есть формат "\ e" должен быть заменен на формат "\ [\ e".

Красный = "\\ e [1; 31 м" - не работает
Красный = "\ [\ e [1; 31м \]" - работает
prosseek
источник

Ответы:

12

У меня есть вспомогательная функция для установки приглашения, и, поскольку я не хочу тратить больше времени на поиск ссылок на escape-код, я кодировал все значения цвета текста в нем.

function set_prompt ( )
{
    # Prompt setup
    # ##################

    # Black            \e[0;30m
    # Blue             \e[0;34m
    # Green            \e[0;32m
    # Cyan             \e[0;36m
    # Red              \e[0;31m
    # Purple           \e[0;35m
    # Brown            \e[0;33m
    # Gray             \e[0;37m
    # Dark Gray        \e[1;30m
    # Light Blue       \e[1;34m
    # Light Green      \e[1;32m
    # Light Cyan       \e[1;36m
    # Light Red        \e[1;31m
    # Light Purple     \e[1;35m
    # Yellow           \e[1;33m
    # White            \e[1;37m

    local COLOR_DEFAULT='\[\e[0m\]'
    local COLOR_BLACK='\[\e[0;30m\]'
    local COLOR_BLUE='\[\e[0;34m\]'
    local COLOR_GREEN='\[\e[0;32m\]'
    local COLOR_CYAN='\[\e[0;36m\]'
    local COLOR_RED='\[\e[0;31m\]'
    local COLOR_PURPLE='\[\e[0;35m\]'
    local COLOR_BROWN='\[\e[0;33m\]'
    local COLOR_GRAY='\[\e[0;37m\]'
    local COLOR_DARK_GRAY='\[\e[1;30m\]'
    local COLOR_L_BLUE='\[\e[1;34m\]'
    local COLOR_L_GREEN='\[\e[1;32m\]'
    local COLOR_L_CYAN='\[\e[1;36m\]'
    local COLOR_L_RED='\[\e[1;31m\]'
    local COLOR_L_PURPLE='\[\e[1;35m\]'
    local COLOR_YELLOW='\[\e[1;33m\]'
    local COLOR_WHITE='\[\e[1;37m\]'

    local PS1_SET_TITLE='\[\e]0;\w\a\]'

    local PS1_SET_TIME="${COLOR_DEFAULT}\t"
    local PS1_SET_RET_CODE="${COLOR_L_RED}(\$?)"
    local PS1_SET_USER="${COLOR_L_GREEN}\u@\h"
    local PS1_SET_PWD="${COLOR_YELLOW}\w"

    local PS1_LN_1="${PS1_SET_TITLE}\n"
    local PS1_LN_2="${PS1_SET_TIME} ${PS1_SET_RET_CODE} "
    local PS1_LN_2="${PS1_LN_2}${PS1_SET_USER} ${PS1_SET_PWD} ${COLOR_DEFAULT}\n"

    echo "${PS1_LN_1}${PS1_LN_2}"
}

Затем вы можете сделать:

PS1=$( set_prompt )

# Use '#' for root shell
export PS1=${PS1}'$ '

unset -f set_prompt

Вот ссылка, которая объясняет коды терминала VT100: http://www.termsys.demon.co.uk/vtansi.htm

\[- начало последовательности непечатаемых символов
\]- конец последовательности непечатаемых символов

  • В чем разница между "[\ e [32; 1m]" и \ e [32; 1m "? Они одинаковые?

Не то же самое, и это должно быть \[\e[32;1m\]'. Without[] `он попытается напечатать последовательность в консоли.

  • Что означает STARTCOLOR (\ e [40m) / ENDCOLOR (\ e [0m)?

STARTCOLOR, означает установить фон в черный цвет, ENDCOLOR означает сбросить все текстовые атрибуты, что означает «дать мне цвет консоли по умолчанию»

Александр Погребняк
источник
+1 Очень мило !!! Не против, чтобы я скопировал это на мой bashrc :)
Eldelshell
@Ubersoldat. Не за что.
Александр Погребняк
1
Используется \$для автоматического переключения между индикацией root и non-root.
Приостановлено до дальнейшего уведомления.
9

Из руководства по bash:

\[    начать последовательность непечатаемых символов, которую можно использовать для встраивания управляющей последовательности терминала в подсказку,
\]    конец последовательности непечатаемых символов

\[и \]не передаются в терминал. Они говорят Bash, что символы между ними не будут напечатаны. Без них bash не мог бы знать, что последовательность, следующая за escape-символом (например, g. [32;1m), Не занимает места на экране, что объясняет, почему он не вычислял длину приглашения правильно, когда вы их опускали.

Обратите внимание, что вы не очень последовательны в своем вопросе (или, возможно, это просто ошибка с Markdown); вам нужно иметь буквенную последовательность скобок с обратной косой чертой $PS1, а не просто скобку (которая будет отображаться буквально).

Escape-последовательности, начинающиеся с \e, интерпретируются эмулятором терминала. Они задокументированы в документе управляющих последовательностей Xterm (ctlseqs) (другие эмуляторы терминала, как правило, в основном совместимы). Например, \e[32;1mпереключается на жирный и зеленый передний план; \e[40mпереключает цвет фона на черный; \e[0mвосстанавливает атрибуты по умолчанию.

Жиль "ТАК - перестань быть злым"
источник
3

Большинство современных эмуляторов терминала могут использовать управляющие коды ANSI для управления различными аспектами дисплея.

Большинство кодов ANSI начинаются с двухсимвольного кода ESC- [это escape-символ (десятичный ASCII 27), за которым следует символ открытой квадратной скобки. Эта последовательность также известна как CSI или инициатор последовательности управления.

Поскольку escape-символ не является тем, который вы можете ввести напрямую (клавиша Esc имеет другое, часто используемое в приложениях), bash использует «\ e» для ссылки на него.

Для изменения цвета текста используется команда ANSI Set Graphics Mode:

\e[<value>m

где <value>может быть список значений, разделенных точкой с запятой ( ;). Обычно используется только одно значение, хотя атрибут bold полезен в сочетании с атрибутами цвета.

Глядя на значения, перечисленные в ответе Александра Погребняка, 0 или 1 перед точкой с запятой выбирают жирным шрифтом или нет:

\e[1m  # bold
\e[5m  # blink
\e[0m  # all attributes off

Здесь есть полезный список кодов http://ascii-table.com/ansi-escape-sequence.php

др-Январь
источник