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\]"
\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.