konfiguracja bash PS1

9

Próbuję skonfigurować PS1 w następujący sposób.

Zielony = „\ [\ e [32; 1m \]”
Czerwony = „\ e [0; 31m”
Fioletowy = „\ e [0; 35m”
STARTCOLOR = „\ [\ e [40m \]”
ENDCOLOR = "\ [\ e [0m \]"
eksport PS1 = "$ STARTCOLOR $ zielony \ u @ $ fioletowy \ h $ czerwony \ w $ zielony> $ ENDCOLOR"

I mam kilka pytań.

  • Jaka jest różnica między „[\ e [32; 1m]” a \ e [32; 1m ”? Czy są takie same?
  • Po uruchomieniu polecenia „eksport PS1” działa dobrze, ale gdy podam około 20 znaków, znaki są nadpisywane podczas dołączania. Co jest z tym nie tak?
  • Jakie jest znaczenie STARTCOLOR (\ e [40m) / ENDCOLOR (\ e [0m)?

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

DODANY

Po kilku testach otrzymałem następującą zmianę, która może rozwiązać problem. Oznacza to, że format „\ e” należy zastąpić formatem „\ [\ e”.

Czerwony = „\\ e [1; 31m” - nie działa
Czerwony = „\ [\ e [1; 31m \]” - działa
prosseek
źródło

Odpowiedzi:

12

Mam funkcję pomocnika, aby ustawić monit, a ponieważ nie chcę poświęcać więcej czasu na szukanie odniesień do kodu ucieczki, zakodowałem w nim wszystkie wartości kolorów tekstu.

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}"
}

Następnie możesz wykonać:

PS1=$( set_prompt )

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

unset -f set_prompt

Oto link wyjaśniający kody terminali VT100: http://www.termsys.demon.co.uk/vtansi.htm

\[- rozpoczęcie sekwencji znaków niedrukowalnych
\]- zakończenie sekwencji znaków niedrukowalnych

  • Jaka jest różnica między „[\ e [32; 1m]” a \ e [32; 1m ”? Czy są takie same?

To nie to samo i powinno być \[\e[32;1m\]'. Without[] `spróbuje wydrukować sekwencję w konsoli.

  • Jakie jest znaczenie STARTCOLOR (\ e [40m) / ENDCOLOR (\ e [0m)?

STARTCOLOR, oznacza ustawienie tła na czarny, ENDCOLOR oznacza zresetowanie wszystkich atrybutów tekstu, co oznacza „daj mi domyślny kolor konsoli”

Alexander Pogrebnyak
źródło
+1 Bardzo miło !!! Nieważne, że skopiuję to do mojego bashrc :)
Eldelshell,
@Ubersoldat. Ani trochę.
Alexander Pogrebnyak
1
Służy \$do automatycznego przełączania między wskazaniem root a non-root.
Wstrzymano do odwołania.
9

Z podręcznika bash:

\[    rozpocząć sekwencję znaków niedrukowalnych, których można użyć do osadzenia terminalu sterującego w wierszu poleceń
\]    koniec sekwencji znaków niedrukowalnych

\[i \]nie są przekazywane do terminala. Mówią bashowi, że znaki między nimi nie będą drukowane. Bez nich bash nie wiedziałby, że sekwencja po znaku ucieczki (np. [32;1m) Nie zajmuje miejsca na ekranie, co tłumaczy, dlaczego nie wyliczył poprawnie długości pytania, gdy je pominąłeś.

Zauważ, że nie byłeś bardzo konsekwentny w swoim pytaniu (a może to tylko pomyłka z Markdown); musisz mieć dosłowną sekwencję nawiasów ukośnik odwrotny $PS1, a nie tylko nawias (który byłby wyświetlany dosłownie).

Sekwencje specjalne rozpoczynające się od \esą interpretowane przez emulator terminala. Są one udokumentowane w dokumencie Sekwencje kontrolne Xterm (ctlseqs) (inne emulatory terminali są zwykle w większości kompatybilne). Na przykład \e[32;1mprzełącza na pogrubiony i zielony pierwszy plan; \e[40mzmienia kolor tła na czarny; \e[0mprzywraca domyślne atrybuty.

Gilles „SO- przestań być zły”
źródło
3

Większość współczesnych emulatorów terminali jest w stanie używać kodów specjalnych ANSI do sterowania różnymi aspektami wyświetlania.

Większość kodów ANSI zaczyna się od dwuznakowego kodu ESC- [To jest znak zmiany znaczenia (dziesiętny 27 ASCII), po którym następuje znak otwartego nawiasu kwadratowego. Ta sekwencja jest również znana jako CSI lub Control Sequence Initiator.

Ponieważ znak zmiany znaczenia nie jest tym, który można wpisać bezpośrednio (klawisz Esc ma inne, często specyficzne dla aplikacji, zastosowania), bash używa „\ e” w odniesieniu do niego.

Zmiana koloru tekstu odbywa się za pomocą polecenia ANSI Set Graphics Mode:

\e[<value>m

gdzie <value>może być lista wartości oddzielonych średnikami ( ;). Zwykle używana jest tylko jedna wartość, chociaż pogrubiony atrybut jest przydatny w połączeniu z atrybutami koloru.

Patrząc na wartości wymienione w odpowiedzi Aleksandra Pogrebnyaka, 0 lub 1 przed średnikiem wybiera pogrubienie lub nie:

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

Przydatna lista kodów znajduje się tutaj http://ascii-table.com/ansi-escape-sequences.php

dr-jan
źródło