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”
\$
do automatycznego przełączania między wskazaniem root a non-root.Z podręcznika bash:
\[
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
\e
są 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;1m
przełącza na pogrubiony i zielony pierwszy plan;\e[40m
zmienia kolor tła na czarny;\e[0m
przywraca domyślne atrybuty.źródło
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:
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:
Przydatna lista kodów znajduje się tutaj http://ascii-table.com/ansi-escape-sequences.php
źródło