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;36m
jest 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
, tput
poszuka 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 setaf
kodó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 tput
bę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\]"
\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.