Ada beberapa aspek yang berperan dalam apa yang Anda tanyakan.
Pertama, bash tidak mendefinisikan warna. Sebenarnya bash sama sekali tidak tahu bahwa warna bahkan ada. Yang ia tahu adalah bahwa Anda mengatakannya untuk menampilkan karakter \033[0;36m
. Emulator terminal Anda (xterm, terminal gnome, apa pun) menerima karakter ini dan memahami "Saya harus mulai menghasilkan dalam cyan".
Jadi emulator terminal Anda yang mengerti warna. Emulator terminal Anda memahami bahwa itu \033[0;36m
adalah cyan, tetapi emulator terminal lain mungkin menggunakan serangkaian karakter yang sama sekali berbeda untuk cyan (meskipun tidak ada emulator terminal yang waras yang akan memamerkan standar dan melakukan ini). Ini alasannya tput
. Ketika Anda menjalankan tput setaf 6
, tput
akan mencari kode escape terminal Anda untuk warna 6 (cyan), dan menampilkan kode escape itu.
(lihat pertanyaan ini untuk info lebih lanjut tentang tput setaf
kode)
Sekarang kembali ke bash. Seperti yang mungkin Anda perhatikan, ketika saya merujuk pada warna cyan, saya telah menggunakan \033[0;36m
, bukan \[\033[0;36m\]
. Kurung kotak telah hilang. Tujuan dari tanda kurung siku adalah bahwa ketika menggunakan kode melarikan diri (warna) di prompt, bash harus mengetahui karakter mana yang tidak dicetak (lebar nol, tidak benar-benar menunjukkan apa-apa). Dengan demikian Anda menyertakan karakter non-cetak \[
\]
. Jika Anda menghapus karakter-karakter ini, semuanya mungkin tampak berfungsi dengan baik pada awalnya, tetapi Anda akan mulai mengalami segala macam keanehan ketika perintah Anda melebihi lebar terminal. Ini karena saat mengetik, bash harus tahu kapan perintah harus membungkus ke baris berikutnya. Untuk melakukan ini, ini menghitung lebar prompt, dan kemudian lebar berapa banyak yang Anda ketikkan.
Catatan lain, tentang tput
. CYAN="\[\033[0;36m\]"
aku s tidak sama dengan CYAN="$(tput setaf 6)"
. Seperti yang baru saja kita bahas, tanda kurung siku relevan dengan bash, dan tput
hanya akan menampilkan kode escape terminal.
Karena tanda kurung biasanya hanya relevan pada prompt, jika Anda menggunakan warna dalam output skrip atau sesuatu, Anda tidak boleh menggunakannya. Berarti bahwa jika Anda akan menggunakan warna lebih dari yang diminta, Anda perlu mendefinisikan beberapa variabel. Satu dengan tanda kurung siku untuk digunakan di prompt, dan satu tanpa tanda untuk yang lainnya. Meskipun Anda bisa menambahkan tanda kurung siku secara manual setiap kali Anda merujuk warna pada prompt.
Singkatnya, Anda mungkin ingin mendefinisikan sesuatu seperti:
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
, misalnya, secara teknis tidak mewakili abu-abu, melainkan slot warna biasanya ditampilkan sebagai abu-abu oleh terminal. Emulator terminal bebas untuk mengubah warna tampilan aktual, dan sering menjadikannya opsi yang dapat dikonfigurasi pengguna.