bash налаштування PS1


9

Я намагаюся зробити PS1 налаштованим так.

Зелений = "\ [\ e [32; 1м \]"
Червоний = "\ e [0; 31м"
Фіолетовий = "\ e [0; 35м"
STARTCOLOR = "\ [\ e [40м \]"
ENDCOLOR = "\ [\ e [0m \]"
export PS1 = "$ STARTCOLOR $ зелений \ u @ $ фіолетовий \ h $ червоний \ w $ зелений> $ ENDCOLOR"

І у мене є питання.

  • Яка різниця між "[\ e [32; 1m]" та \ e [32; 1m "? Вони однакові?
  • Після запуску команди «експортувати PS1» вона працює добре, але коли я вводя введення близько 20 символів, символи перезаписуються, як я додав. Що з цим?
  • Що означає STARTCOLOR (\ e [40m) / ENDCOLOR (\ e [0m)?

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

ДОБАВЛЕНО

Після деяких тестів я отримав наступні зміни, які могли б вирішити проблему. Тобто формат "\ e" має бути замінений на формат "\ [\ e".

Червоний = "\\ e [1; 31м" - не працює
Червоний = "\ [\ e [1; 31м \]" - працює

Відповіді:


12

У мене є допоміжна функція для встановлення підказки, і оскільки я не хочу витрачати більше часу на пошук посилань на код виходу, я зашифрував у неї всі значення кольору тексту.

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
Використовуйте \$для автоматичного перемикання між кореневою та некореневою індикацією.
Призупинено до подальшого повідомлення.

9

З посібника з bash:

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

\[і \]не передаються до терміналу. Вони кажуть, що герої між ними не друкуються. Без них bash не міг знати, що послідовність, що слідує за символом евакуації (наприклад, [32;1m), не займає жодного місця на екрані, що пояснює, чому він неправильно обчислював довжину підказки, коли ви їх виключали.

Зауважте, що ви не дуже відповідали своєму питанню (або, можливо, це просто помилка з Маркдаун); у вас повинна бути буквальна послідовність зворотної косої риски $PS1, а не лише дужка (яка відображатиметься буквально).

Послідовності виходу, що починаються з \e, інтерпретуються емулятором терміналу. Вони задокументовані в документі керування послідовностями Xterm (ctlseqs) (інші емулятори терміналів, як правило, сумісні). Наприклад, \e[32;1mперемикачі на жирний і зелений передній план; \e[40mперемикає колір тла на чорний; \e[0mвідновлює атрибути за замовчуванням.


3

Більшість сучасних емуляторів терміналів можуть використовувати коди аварійних відхилень ANSI для управління різними аспектами дисплея.

Більшість кодів ANSI починається з 2-символьного коду ESC- [Це символ втечі (ASCII десятковий 27) з наступним символом відкритого квадратного дужки. Ця послідовність також відома як CSI або ініціатор управління послідовністю управління.

Оскільки символ евакуації - це не той, який ви можете ввести безпосередньо (у клавіші Esc є інші, часто застосовні конкретні програми), bash використовує '\ e' для посилання на нього.

Зміна кольору тексту використовується командою ANSI Set Graphics Mode:

\e[<value>m

де <value>може бути список значень, розділених напівколонами ( ;). Зазвичай використовується лише одне значення, хоча жирний атрибут корисний у поєднанні з атрибутами кольору.

Дивлячись на значення, вказані у відповіді Олександра Погребняка, 0 або 1 перед крапкою з двократкою виділяється жирним шрифтом чи ні:

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

Тут є корисний список кодів http://ascii-table.com/ansi-escape-sequences.php

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.