Zmieniasz kolor tekstu i tło terminala?

72

Mogę zmienić kolor za pomocą preferencji, ale jak mogę zmienić kolor tła i kolor tekstu terminala za pomocą wiersza poleceń?

TechJhola
źródło
na stałe czy przypadkowo?
Jacob Vlijm,
Możesz także użyć dconf. Odpowiedziałem wcześniej na podobne pytanie: askubuntu.com/a/628129/295286
Sergiy Kolodyazhnyy
\033[00;34mFOO\033[00m
Rafael Barros

Odpowiedzi:

50

Na niektórych terminalach kompatybilnych z XTerm / ANSI (jak xtermi gnome-terminal) można ustawić kolory przy użyciu palety większej niż domyślna paleta 8/16 kolorów (na przykład przy użyciu palety 88 kolorów, 256 kolorów lub 16777216 kolorów (RGB) , zarówno xtermi gnome-terminalobsługiwać zarówno 256 kolory i kolory-16777216 (RGB) palety); pamiętaj, że powłoka może to zmienić (tak jest np. w przypadku zsh).

Oto skrypt wyświetlający listę kolorów w palecie 256 kolorów wraz z ich kodem kolorów ANSI w terminalach kompatybilnych z XTerm / ANSI z obsługą palety 256 kolorów:

#!/bin/bash
for((i=16; i<256; i++)); do
    printf "\e[48;5;${i}m%03d" $i;
    printf '\e[0m';
    [ ! $((($i - 15) % 6)) -eq 0 ] && printf ' ' || printf '\n'
done

zrzut ekranu 1

zrzut ekranu

W zależności od tego, czy chcesz zastosować kolor na pierwszym planie, czy na tle, użyj <fg_bg>wartości 38lub 48(odpowiednio) w następującym poleceniu:

printf '\e[<fg_bg>;5;<ANSI_color_code>m'

Na przykład, aby ustawić kolor pierwszego planu ( <fg_bg>= 38) na czerwony ( <ANSI_color_code>= 196), a kolor tła ( <fg_bg>= 48) na czarny ( <ANSI_color_code>= 0):

printf '\e[38;5;196m Foreground color: red\n'
printf '\e[48;5;0m Background color: black\n'

zrzut ekranu 3

Konieczne jest przerysowanie znaku zachęty printf '\e[K', aby kolor tła został zastosowany do całej linii, a kolor pierwszego planu - do kursora:

screenshot4

To samo można osiągnąć za pomocą wartości RGB zamiast kodów kolorów ANSI w kompatybilnym terminalu; w zależności od tego, czy chcesz zastosować kolor na pierwszym planie, czy na tle, użyj <fg_bg>wartości 38lub 48(odpowiednio) w następującym poleceniu:

printf '\e[<fg_bg>;2;<R>;<G>;<B>m'

Na przykład, aby ustawić kolor pierwszego planu ( <fg_bg>= 38) na czerwony ( <R>= 255, <G>= 0, <B>= 0), a kolor tła ( <fg_bg>= 48) na czarny ( <R>= 0, <G>= 0, <B>= 0):

printf '\e[38;2;255;0;0m Foreground color: red\n'
printf '\e[48;2;0;0;0m Background color: black\n'

zrzut ekranu 5

Ponownie konieczne jest przerysowanie znaku zachęty printf '\e[K', aby kolor tła został zastosowany do całej linii, a kolor pierwszego planu - do kursora:

zrzut ekranu6

Za pomocą jednej z metod można użyć printf '\e[0m'do zresetowania wszystkich atrybutów:

zrzut ekranu7

kos
źródło
1
Zarówno xtermi gnome-terminalrozpoznaje \ e [38/48, 2, R, G; Bm prawdziwe kolorów sekwencji sterujących; jednak xtermzaokrągla rzeczywisty kolor do najbliższej w 256-paletowej palecie kolorów. gnome-terminalwyświetla dokładny prawdziwy kolor podany w sekwencji ucieczki.
egmont
2
\ e [K jest niebezpieczny; w niektórych emulatorach (np. xterm), jeśli kursor znajduje się na bardzo prawej krawędzi (wizualnie wyświetlany w kolumnie po prawej stronie, ale logicznie już poza tym, ponieważ znak był już wydrukowany w kolumnie po prawej stronie), ostatnia litera jest usuwana. Zobacz np. Bugzilla.gnome.org/show_bug.cgi?id=740789 lub savannah.gnu.org/bugs/?36831 .
egmont
Korygując siebie: jeśli emitujesz \ e [K na początku wiersza (na początku monitu, a nie na jego końcu), to oczywiście jest to bezpieczne. (Nie będzie jednak działał z wierszem ani poleceniem wielowierszowym).
egmont
@egmont Dzięki za przydatne informacje, widzę, że w GNOME Bugzilla, który jest oznaczony jako naprawiony, czy tak jest w przypadku? Nie mogę tego teraz przetestować, więc zrobię to później, aby sprawdzić, czy nadal tak jest (chyba że odpowiesz najpierw) i dołączę tę informację do odpowiedzi.
Kos
Najnowsze wersje gnome-terminalu nie usuwają tej postaci. To, czy jest to prawidłowe zachowanie, jest wątpliwe. W końcu graficzne emulatory terminali emulują niektóre starożytne urządzenia. Czy powinniśmy naśladować ich złe decyzje projektowe (jak robi to Xterm), czy też powinniśmy nadpisywać (jak to robimy w terminalu gnome)? To trudne pytanie, na które nie ma jednej poprawnej odpowiedzi.
egmont
33

Informacje znalezione na tej stronie , z wyjątkiem kolumny podglądu:

Sekwencje składają się ze znaku Escape (często reprezentowanego przez „ ^[” lub „ <Esc>”), a następnie kilku innych znaków: „ ^[FCm” (gdzie FCjest jedną z liczb na poniższej liście punktowanej).

W bashThe Esckod może być jedną z następujących czynności:

  1. \e
  2. \033 (ósemkowy)
  3. \x1B (szesnastkowy)

Uwaga 1: Sekwencja „ \e[0m” usuwa wszystkie atrybuty (formatowanie i kolory). Dobrym pomysłem może być dodanie go na końcu każdego kolorowego tekstu.

Uwaga 2: Kolory pierwszego planu i tła mogą się różnić w zależności od konfiguracji terminala i nie wszystkie kolory są obsługiwane .

Ustaw / Resetuj

  • 0: Resetuj / usuń wszystkie atrybuty modyfikatora, pierwszego planu i tła: echo -e "\e[0mNormal Text"
  • 1: Pogrubienie / Jasność: echo -e "Normal \e[1mBold"
  • 2: Dim: echo -e "Normal \e[2mDim"
  • 4: Podkreślono: echo -e "Normal \e[4mUnderlined"
  • 5: Miga (nie działa w większości terminali oprócz XTerm): echo -e "Normal \e[5mBlink"
  • 7: Odwróć / Odwróć: echo -e "Normal \e[7minverted"
  • 8: Ukryty (przydatny do poufnych informacji): echo -e "Normal \e[8mHidden Input"
  • 21: Resetuj / Usuń pogrubienie / jasne: echo -e "Normal \e[1mBold \e[21mNormal"
  • 22: Resetuj / Usuń dim: echo -e "Normal \e[2mDim \e[22mNormal"
  • 24: Resetuj / Usuń podkreślenie: echo -e "Normal \e[4mUnderlined \e[24mNormal"
  • 25: Resetuj / Usuń miganie: echo -e "Normal \e[5mBlink \e[25mNormal"
  • 27: Resetuj / Usuń bieg wsteczny / odwrócony: echo -e "Normal \e[7minverted \e[27mNormal"
  • 28: Resetuj / Usuń ukryty: echo -e "Normal \e[8mHidden \e[28mNormal"

Pierwszoplanowy

  • 39: Domyślnie (zwykle zielony, biały lub jasnoszary): echo -e "Default \e[39mDefault"
  • 30Czarny: echo -e "Default \e[30mBlack"(najlepiej w połączeniu z kolorem tła: echo -e "Default \e[30;107mBlack on white")
  • 31: Czerwony (nie używaj z zielonym tłem)
  • 32: Zielony
  • 33: Żółty
  • 34: Niebieski
  • 35: Magenta / Purple
  • 36: Cyan
  • 37: Jasny szary
  • 90: Ciemny szary
  • 91: Jasnoczerwony
  • 92: Jasnozielony
  • 93: Jasny zółty
  • 94: Jasny niebieski
  • 95: Jasny magenta / różowy
  • 96: Jasnobłękitny
  • 97: Biały

tło

  • 49: Domyślny kolor tła (zwykle czarny lub niebieski)
  • 40: Czarny
  • 41: Czerwony
  • 42: Zielony
  • 43: Żółty
  • 44: Niebieski
  • 45: Magenta / Purple
  • 46: Cyan
  • 47: Jasnoszary (nie używaj z białym pierwszym planem)
  • 100: Ciemnoszary (nie używaj z czarnym pierwszym planem)
  • 101: Jasnoczerwony
  • 102: Jasnozielony (nie używaj z białym pierwszym planem)
  • 103: Jasnożółty (nie używaj z białym pierwszym planem)
  • 104: Jasnoniebieski (nie używaj z jasnożółtym pierwszym planem)
  • 105: Jasny magenta / różowy (nie używaj z jasnym pierwszym planem)
  • 106: Jasnobłękitny (nie używaj z białym pierwszym planem)
  • 107: Biały (nie używać z jasnym pierwszym planem)

Aby ustawić jednocześnie kolory pierwszego planu i tła, użyj formularza echo -e "\e[S;FG;BGm". Na przykład: echo -e "\e[1;97;41m"(pogrubiony biały pierwszy plan na czerwonym tle)

256 opcji kolorów można znaleźć na stronie źródłowej.

Agi Hammerthief
źródło
30

Zmień kolory przypadkowo

Jeśli ma to na celu przypadkową zmianę kolorów :

Możesz użyć polecenia setterm :

setterm -term linux -back <background_colour> -fore <text_color> -clear

spośród kolorów, które możesz wybrać (zarówno na przednim, jak i na tle):

black|blue|green|cyan|red|magenta|yellow|white|default

więcej opcji:

setterm -help

Zmień ustawienia profilu (koloru)

W 14.04 nie znalazłem opcji dconfustawiania kolorów ani terminala. Możesz jednak użyćgconftool

  • Najpierw musisz uzyskać nazwę swojego profilu:

    gconftool-2 --get /apps/gnome-terminal/global/profile_list
    
  • Następnie, aby ustawić kolory tekstu swojego profilu:

    gconftool-2 --set "/apps/gnome-terminal/profiles/<profile_name>/foreground_color" --type string "#FFFFFF"
    

    na przykład, aby ustawić kolor tekstu na biały

    To samo z kolorem tła:

    gconftool-2 --set "/apps/gnome-terminal/profiles/<profile_name>/background_color" --type string "#000000"
    

    na przykład, aby ustawić kolor tła na czarny

Alternatywnie, aby ustawić nazwę koloru (kolorów), możesz po prostu użyć whitelub greenz tej samej palety co polecenie setterm, np .:

gconftool-2 --set "/apps/gnome-terminal/profiles/<profile_name>/background_color" --type string black
Jacob Vlijm
źródło
1
Powinny to być podwójne myślniki w początkowej komendzie setterm.
user1770201,
Pracowałem 14.04, ale nie 16.04 (beta; nie jestem pewien, czy to jest powód) ... Mimo to dconf write /org/gnome/terminal/legacy/profiles:/:<profile_id>/background-color "'rgb(0,0,0)'"udało się.
Janaka Bandara
Nie działa na Ubuntu 1704, wygląda źle
Wax Cage
1
gconftool-2(dla Ubuntu 14.04 i być może kilku kolejnych wydań) dconflub gsettingsw nowszych wersjach Ubuntu zmień ustawienia gnome-terminal i od razu zacznij działać na wszystkich kartach i oknach tego samego profilu. Nie sądzę, żeby OP szukał takiego zachowania.
egmont
5

Różne kody kolorów użyte do uzyskania kolorowych wydruków mogą być również użyte do uzyskania kolorowego tła :

40  black
41  red
42  green
43  yellow
44  blue
45  magenta
46  cyan
47  white

Dlatego następujące polecenie zmienia kolor tła na czerwony:

$ echo -e '\e[0;41m'

W zależności od powłoki, emulatora terminala itp. Może nie być potrzebny -e.

muru
źródło
3

Zobacz odpowiedź kos dotyczącą przełączania pierwszego planu lub tła na określony kolor palety, a nawet bezpośredni kolor RGB w niektórych terminalach. Efekt takiej sekwencji trwa, dopóki nie zostanie wybrany inny kolor (lub nie zostanie przywrócony domyślny).

Innym podejściem obsługiwanym przez niektóre emulatory terminali jest ponowne zdefiniowanie dokładnych wartości RGB domyślnych kolorów pierwszego planu i tła terminala przy użyciu sekwencji specjalnych OSC 10/11:

echo -ne '\e]10;#123456\e\\'  # set default foreground to #123456
echo -ne '\e]11;#abcdef\e\\'  # set default background to #abcdef

Prawdopodobnie potrwa to znacznie dłużej (dopóki nie zostanie zastąpione przez inny OSC 10/11 lub zresetowany przez OSC 110/111), ale w przeciwieństwie do podejścia dconf, nadal wpływa to tylko na aktualny terminal.

egmont
źródło