Czy końcowe sekwencje specjalne koloru są zdefiniowane gdziekolwiek dla bash?

22

Używałem tak często kolorów w skryptach Bash (głównie w CentOS), ale aby ich użycie było bardziej przekonujące, ostatecznie zmieniam definicje zmiennych na wartości kolorów:

local GRAY="\[\033[1;30m\]"
local LIGHT_GRAY="\[\033[0;37m\]"
local CYAN="\[\033[0;36m\]"
local LIGHT_CYAN="\[\033[1;36m\]"
local NO_COLOUR="\[\033[0m\]"

lub również z tput:

bold=`tput bold`
normal=`tput sgr0`
whitef=`tput setaf 7`
greenf=`tput setaf 2`
redb=`tput setab 1`

Przeszukałem /etc/rc.d/init.dkatalog, ale nie znalazłem tam nic związanego z definicjami kolorów.

Czy istnieje już taka definicja? Jeśli nie, umieściłbym je w pliku, /etc/rc.d/init.dna przykład, i umieściłbym w moich skryptach, trochę jak z/etc/rc.d/init.d/functions

fduff
źródło
Nie są, ponieważ \e[1;30m, na przykład, technicznie nie reprezentują szarości, ale raczej gniazdo kolorów zwykle wyświetlane przez terminal jako szare. Emulatory terminali mogą swobodnie zmieniać rzeczywiste kolory wyświetlacza i często sprawiają, że są one konfigurowalne przez użytkownika.
chepner

Odpowiedzi:

36

W tym pytaniu jest kilka aspektów.

Po pierwsze, bash nie definiuje kolorów. W rzeczywistości bash absolutnie nie ma pojęcia, że ​​kolory w ogóle istnieją. Wie tylko, że kazałeś mu wypisać postacie \033[0;36m. Twój emulator terminala (xterm, gnome-terminal, cokolwiek) odbiera te znaki i rozumie „Muszę zacząć wypisywać w cyjanie”.

Zatem to twój emulator terminala rozumie kolory. Twój emulator terminala rozumie, że \033[0;36mjest niebieskozielony, ale inny emulator terminala może używać zupełnie innego zestawu znaków dla cyjan (choć żaden rozsądny emulator terminala nie obnosi się ze standardem i robi to). To jest powód tput. Kiedy uruchomisz tput setaf 6, tputposzuka kodów ucieczki twojego terminala dla koloru 6 (cyjan) i wyśle ​​ten kod ucieczki.
(zobacz to pytanie, aby uzyskać więcej informacji na temat tput setafkodów)

Teraz wracaj do bashu. Jak pewnie zauważyłeś, kiedy miałem na myśli kolor cyjan, używałem \033[0;36m, a nie \[\033[0;36m\]. Brakuje nawiasów kwadratowych. Celem nawiasów kwadratowych jest to, że podczas używania kodów ucieczki (kolorów) w pytaniu, bash musi wiedzieć, które znaki nie drukują (szerokość zero, właściwie nic nie pokazują). W ten sposób zamykasz znaki niedrukowalne \[ \]. Jeśli usuniesz te znaki, na początku wszystko może wyglądać dobrze, ale zaczniesz wpadać w różnego rodzaju dziwności, gdy twoje polecenie przekroczy szerokość terminala. Wynika to z tego, że podczas pisania bash musi wiedzieć, kiedy polecenie powinno zostać zawinięte do następnego wiersza. Aby to zrobić, oblicza szerokość monitu, a następnie szerokość wpisanego tekstu.

Kolejna uwaga na temat tput. CYAN="\[\033[0;36m\]"to nie to samo co CYAN="$(tput setaf 6)". Jak właśnie przedyskutowaliśmy, nawiasy kwadratowe odnoszą się do bash i tputbędą wyświetlać tylko kody ucieczki terminala.

Ponieważ nawiasy kwadratowe są zwykle istotne tylko w pytaniu, jeśli używasz kolorów na wyjściu skryptu lub czegoś, nie powinieneś ich używać. Oznacza to, że jeśli zamierzasz używać kolorów przez więcej niż monity, musisz zdefiniować wiele zmiennych. Jeden z nawiasami kwadratowymi do użycia w wierszu polecenia, a drugi bez użycia wszystkiego innego. Chociaż możesz po prostu ręcznie dodać nawiasy kwadratowe za każdym razem, gdy odwołujesz się do koloru w monicie.

Krótko mówiąc, prawdopodobnie chcesz zdefiniować coś takiego:

local CYAN="$(tput setaf 6)" # OR CYAN="\033[0;36m"
local LIGHT_CYAN="$CYAN$(tput bold)" # OR LIGHT_CYAN="\033[1;36m"
local PROMPT_CYAN="\[$CYAN\]"
local PROMPT_LIGHT_CYAN="\[$LIGHT_CYAN\]"
Patrick
źródło
Jak w takim razie widzę kolory podczas logowania do prawdziwego terminala za pomocą Ctrl+ Alt+ F1?
Serge Stroobandt,