Mengubah warna teks dan latar belakang terminal?

74

Saya dapat mengubah warna melalui preferensi, tetapi bagaimana saya bisa mengubah warna latar belakang dan warna teks terminal melalui baris perintah?

TechJhola
sumber
secara permanen atau kebetulan?
Jacob Vlijm
Anda juga bisa menggunakan dconf. Saya telah menulis jawaban untuk pertanyaan serupa sebelumnya: askubuntu.com/a/628129/295286
Sergiy Kolodyazhnyy
\033[00;34mFOO\033[00m
Rafael Barros

Jawaban:

50

Pada terminal tertentu yang kompatibel dengan XTerm / ANSI (seperti xtermdan gnome-terminal), Anda dapat mengatur warna menggunakan palet yang lebih besar daripada palet standar 8/16-warna (misalnya menggunakan palet 88-warna, 256-warna atau 16777216-warna (RGB) ; keduanya xtermdan gnome-terminalmendukung palet 256-warna dan 16777216-warna (RGB)); keberatan bahwa shell mungkin menimpa ini (ini adalah kasus misalnya untuk zsh).

Berikut ini skrip untuk membuat daftar warna dalam palet 256-warna bersama dengan kode warna ANSI mereka di terminal yang kompatibel dengan XTerm / ANSI dengan dukungan palet 256-warna:

#!/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

tangkapan layar1

tangkapan layar

Bergantung pada apakah Anda ingin menerapkan warna ke latar depan atau ke latar belakang, gunakan <fg_bg>nilai 38atau 48(masing-masing) dalam perintah berikut:

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

Misalnya, untuk mengatur warna latar depan ( <fg_bg>= 38) menjadi merah ( <ANSI_color_code>= 196) dan warna latar belakang ( <fg_bg>= 48) menjadi hitam ( <ANSI_color_code>= 0):

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

tangkapan layar3

Ini perlu untuk menggambar ulang prompt menggunakan printf '\e[K'agar warna latar belakang berlaku untuk seluruh baris dan agar warna latar depan berlaku untuk kursor:

tangkapan layar4

Hal yang sama dapat dicapai dengan menggunakan nilai RGB, bukan kode warna ANSI di terminal yang kompatibel; tergantung pada apakah Anda ingin menerapkan warna ke latar depan atau ke latar belakang, gunakan <fg_bg>nilai 38atau 48(masing-masing) dalam perintah berikut:

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

Misalnya, untuk mengatur warna latar depan ( <fg_bg>= 38) menjadi merah ( <R>= 255, <G>= 0, <B>= 0) dan warna latar belakang ( <fg_bg>= 48) menjadi hitam ( <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'

tangkapan layar5

Sekali lagi, perlu menggambar ulang prompt menggunakan printf '\e[K'agar warna latar belakang berlaku untuk seluruh baris dan agar warna latar depan berlaku untuk kursor:

tangkapan layar6

Menggunakan salah satu metode, Anda dapat menggunakan printf '\e[0m'untuk mengatur ulang semua atribut:

tangkapan layar7

kos
sumber
1
Keduanya xtermdan gnome-terminalmengenali urutan pelarian true color \ 38 [48/48; 2; R; G; Bm; namun, xtermbulatkan warna aktual ke terdekat dalam palet 256-warna. gnome-terminalmenampilkan warna benar yang diberikan dalam urutan escape.
egmont
2
\ e [K berbahaya; di beberapa emulator (mis. xterm) jika kursor berada di tepi paling kanan (ditampilkan secara visual di kolom paling kanan, tetapi secara logis sudah lebih dari itu karena karakter sudah dicetak di kolom paling kanan), huruf terakhir akan dilucuti. Lihat misalnya bugzilla.gnome.org/show_bug.cgi?id=740789 atau savannah.gnu.org/bugs/?36831 .
egmont
Mengoreksi diri sendiri: Jika Anda memancarkan \ K di awal baris (di awal prompt, bukan di akhir) maka tentu saja aman. (Namun tidak akan bekerja dengan multiline prompt atau command.)
egmont
@egmont Terima kasih atas informasi yang bermanfaat, saya melihat bahwa di GNOME Bugzilla yang ditandai sebagai diperbaiki, apakah ini masalahnya? Saya tidak dapat menguji ini pada saat ini, jadi saya akan melakukannya nanti untuk memeriksa apakah ini masih terjadi (kecuali Anda membalas terlebih dahulu) dan memasukkan informasi itu dalam jawabannya.
kos
Yup versi terbaru gnome-terminal tidak menghilangkan karakter itu. Apakah ini perilaku yang benar patut dipertanyakan. Bagaimanapun, emulator terminal grafis meniru beberapa perangkat kuno. Haruskah kita meniru keputusan desain yang buruk (seperti yang dilakukan xterm di sini), atau haruskah kita menimpanya (seperti yang kita lakukan di terminal gnome)? Ini adalah pertanyaan yang sulit tanpa jawaban yang benar.
egmont
34

Informasi seperti yang ditemukan di halaman ini , tidak termasuk kolom pratinjau:

Urutan terdiri dari karakter Escape (sering diwakili oleh " ^[" atau " <Esc>") diikuti oleh beberapa karakter lain: " ^[FCm" (di mana FCadalah salah satu angka dalam daftar berpoin di bawah).

Di bash, Esckode dapat berupa salah satu dari yang berikut:

  1. \e
  2. \033 (oktal)
  3. \x1B (heksadesimal)

Catatan 1: Urutan " \e[0m" menghapus semua atribut (pemformatan dan warna). Ini bisa menjadi ide bagus untuk menambahkannya di akhir setiap teks berwarna.

Catatan 2: Warna latar depan dan latar belakang dapat bervariasi, tergantung pada konfigurasi terminal dan tidak semua warna didukung .

Set / Reset

  • 0: Reset / hapus semua atribut modifier, foreground dan background: echo -e "\e[0mNormal Text"
  • 1: Tebal / Cerah: echo -e "Normal \e[1mBold"
  • 2: Redup: echo -e "Normal \e[2mDim"
  • 4: Bergaris Bawah: echo -e "Normal \e[4mUnderlined"
  • 5: Blink (tidak berfungsi di sebagian besar terminal kecuali XTerm): echo -e "Normal \e[5mBlink"
  • 7: Balikkan / Balikkan: echo -e "Normal \e[7minverted"
  • 8: Tersembunyi (berguna untuk info sensitif): echo -e "Normal \e[8mHidden Input"
  • 21: Setel ulang / Hapus huruf tebal / cerah: echo -e "Normal \e[1mBold \e[21mNormal"
  • 22: Reset / Hapus redup: echo -e "Normal \e[2mDim \e[22mNormal"
  • 24: Atur Ulang / Hapus garis bawah: echo -e "Normal \e[4mUnderlined \e[24mNormal"
  • 25: Atur Ulang / Hapus kedipan: echo -e "Normal \e[5mBlink \e[25mNormal"
  • 27: Atur Ulang / Hapus terbalik / terbalik: echo -e "Normal \e[7minverted \e[27mNormal"
  • 28: Reset / Hapus disembunyikan: echo -e "Normal \e[8mHidden \e[28mNormal"

Latar depan

  • 39: Default (biasanya hijau, putih atau abu-abu terang): echo -e "Default \e[39mDefault"
  • 30: Hitam: echo -e "Default \e[30mBlack"(terbaik dikombinasikan dengan warna latar belakang: echo -e "Default \e[30;107mBlack on white")
  • 31: Merah (tidak digunakan dengan latar belakang hijau)
  • 32: Hijau
  • 33: Kuning
  • 34: Biru
  • 35: Magenta / Ungu
  • 36: Cyan
  • 37: Abu-abu muda
  • 90: Abu-abu gelap
  • 91: Lampu merah
  • 92: Hijau muda
  • 93: Kuning muda
  • 94: Biru muda
  • 95: Light Magenta / Pink
  • 96: Light Cyan
  • 97: Putih

Latar Belakang

  • 49: Warna latar belakang default (biasanya hitam atau biru)
  • 40: Hitam
  • 41: Merah
  • 42: Hijau
  • 43: Kuning
  • 44: Biru
  • 45: Magenta / Ungu
  • 46: Cyan
  • 47: Light Grey (tidak digunakan dengan foreground putih)
  • 100: Dark Grey (tidak digunakan dengan foreground hitam)
  • 101: Lampu merah
  • 102: Hijau Muda (tidak digunakan dengan latar depan putih)
  • 103: Kuning Muda (jangan gunakan dengan foreground putih)
  • 104: Biru Muda (tidak digunakan dengan latar kuning muda)
  • 105: Light Magenta / Pink (tidak digunakan dengan foreground cahaya)
  • 106: Light Cyan (jangan gunakan dengan foreground putih)
  • 107: Putih (jangan gunakan dengan latar depan cahaya)

Untuk mengatur warna latar depan dan latar belakang sekaligus, gunakan formulir yang ada echo -e "\e[S;FG;BGm". Misalnya: echo -e "\e[1;97;41m"(latar depan putih tebal pada latar belakang merah)

Untuk 256 opsi warna, lihat halaman sumber.

Agi Hammerthief
sumber
30

Ubah warna secara insidentil

Jika itu dimaksudkan untuk mengubah warna secara tidak sengaja :

Anda dapat menggunakan perintah setterm :

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

dari warna, Anda dapat memilih dari (depan dan belakang):

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

untuk opsi lainnya:

setterm -help

Ubah pengaturan profil (warna) Anda

Pada 14,04, saya tidak menemukan opsi untuk digunakan dconfuntuk mengatur warna atau terminal. Namun Anda dapat menggunakannyagconftool

  • Anda pertama-tama harus mendapatkan nama profil Anda:

    gconftool-2 --get /apps/gnome-terminal/global/profile_list
    
  • Kemudian, untuk mengatur warna teks dari profil Anda:

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

    misalnya untuk mengatur warna teks menjadi putih

    Sama dengan warna latar:

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

    misalnya untuk mengatur warna latar belakang menjadi hitam

Secara alternatif, untuk mengatur nama warna, Anda cukup menggunakan whiteatau green, dari palet yang sama dengan perintah setterm, misalnya:

gconftool-2 --set "/apps/gnome-terminal/profiles/<profile_name>/background_color" --type string black
Yakub Vlijm
sumber
1
Itu harus berupa tanda hubung ganda dalam perintah setterm awal.
user1770201
Bekerja pada 14,04, tetapi tidak pada 16,04 (beta; tidak yakin apakah itu alasannya) ... Tetap saja, dconf write /org/gnome/terminal/legacy/profiles:/:<profile_id>/background-color "'rgb(0,0,0)'"lakukan triknya.
Janaka Bandara
Tidak bekerja di ubuntu 1704, itu terlihat buruk
Wax Cage
1
gconftool-2(untuk Ubuntu 14.04 dan mungkin beberapa rilis berikut), atau dconfatau gsettingspada versi Ubuntu yang lebih baru mengubah pengaturan terminal gnome, dan segera berlaku pada semua tab dan jendela dari profil yang sama. Saya tidak berpikir OP mencari perilaku ini.
egmont
5

Berbagai kode warna yang digunakan untuk mendapatkan keluaran berwarna juga dapat digunakan untuk mendapatkan latar belakang berwarna :

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

Oleh karena itu, perintah berikut mengubah latar belakang saya menjadi merah:

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

Tergantung pada shell, emulator terminal, dll., Anda mungkin tidak perlu -e.

muru
sumber
3

Lihat jawaban kos untuk mengalihkan latar depan atau latar belakang ke warna palet tertentu, atau bahkan warna RGB langsung di beberapa terminal. Efek dari urutan seperti itu berlangsung sampai warna yang berbeda dipilih (atau itu dikembalikan ke default).

Pendekatan lain, yang didukung oleh beberapa emulator terminal, adalah untuk mendefinisikan kembali nilai RGB yang tepat dari warna foreground dan latar belakang default terminal menggunakan urutan escape 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

Ini kemungkinan akan bertahan lebih lama (sampai ditimpa oleh OSC 10/11 atau reset melalui OSC 110/111), tetapi tidak seperti pendekatan dconf, ini masih mempengaruhi terminal saat ini saja.

egmont
sumber