Xterm'imin renklerini (arka plan, yazı tipi, ön plan) komut satırından değiştirmek istiyorum. Bunun ANSI kaçış dizileri kullanılarak yapılabileceğini duydum.
Mümkünse:
- Nasıl oldu?
- Renk adları kullanabilir miyim yoksa RGB kodlarını mı kullanmalıyım?
Xterm'imin renklerini (arka plan, yazı tipi, ön plan) komut satırından değiştirmek istiyorum. Bunun ANSI kaçış dizileri kullanılarak yapılabileceğini duydum.
Mümkünse:
Yanıtlar:
ANSI çıkış dizileri, Escape karakteri, 27 karakteri ile başlayan bir karakter dizisinden oluşur. Sonraki karakter genellikle (her zaman olmasa da) bir açık köşeli ayraçtır: [
Echo komutu, escape için belirtip -ekullanırsanız kaçış karakterleri gönderebilir \e.
ANSI standardı toplamda 16 olasılık veren 8 renk artı parlak bir mod tanımlar. Sıra:
\e[<number>m
Şunlardan <number>biri:
Ön Plan:
Arka fon:
47 Beyaz
0 Tümünü sıfırla
Bu yüzden ön planınızı kırmızı ve arka planınızı sarı yapmak için:
$ echo -e "\e[31m\e[43m"
Ve kalın harfleri etkinleştirmek için:
$ echo -e "\e[1m"
Elbette hepsini bir araya getirebilirsiniz:
$ echo -e "\e[31m\e[43m\e[1m"
Başka şeyler yapmak için birçok başka kaçış kodu var.
Örneğin - ekranı temizleyin ve imleci sola hareket ettirin:
$ echo -e "\e[2J\e[1;1H"
Rengi değiştirirken kullanışlıdır:
$ echo -e "\e[31m\e[43m\e[1m\e[2J\e[1;1H"
Renkleri değiştirecek, ekranı temizleyiniz ve imleci sol üst tarafa yerleştiriniz. Neredeyse sol üst. Echo bir vagon dönüşü yapar, böylece bir çizgiden aşağı hareket eder. -nTelaşlıysanız bunu önlemek için yankıya ekleyebilirsiniz .
Hepsini karıştırırsanız ve ne yazdığınızı göremiyorsanız, aşağıdaki tuşlara basarak terminal renklerini normale döndürebilirsiniz:
Ctrl+v [ 0 m Return
Umut ettiğiniz şey komut istemidir. Bilinmeyen bir emir hakkında çıldırır, ancak ne yaptığınızı tekrar görebileceksiniz.
echo -ne '\e[31;43m'(yukarıdakilerin yerine echo -e "\e[31m\e[43m").
Modern Xterms'in 32 bit rengi desteklediğini unutmayın!
Basit bir örnek. Değer # 53186f değerinde güzel bir koyu mor arka plan (her biri kendi başına) ayarlamak için şunları yapın:
echo -ne "\033]11;#53186f\007"
Bunun yalnızca sonraki metnin değil, tüm pencerenin rengini anında değiştirdiğini unutmayın. Bu, özellikle bir sunucuyu ssh' ettikten sonra (örneğin) bir pencereyi açıkça farklı yapmak için çok hoş. Yukarıdaki 'echo'ları .bashrc içine koyun ve terminaliniz o sunucuya giriş yaptığınızda renkleri otomatik olarak değiştirir (ancak Ctrl-D çıkışında geri dönmeyecektir).
HOURS'i internette bunu aramak için harcayabilirsiniz - çoğu doküman yalnızca orijinal 16 ANSI rengi hakkında konuşur.
Kaynaklar: http://www.steike.com/code/xterm-colors/ ve http://rtfm.etla.org/xterm/ctlseq.html ("İşletim Sistemi Kontrolleri" altına bakın)
Lütfen dikkat: Yukarıdaki kaçış dizisi XTerm'ler için geçerlidir ve bir XTerm gibi "bakabilen" "XTerm benzeri" pencere terminali emülatörlerinin diğer uygulamaları için çalışmayabilir. Örneğin, "gnome-terminal" veya "konsole" farklı kaçış sekanslarına sahiptir veya hiç renk değişikliği uygulayamayabilir.
Evet. ANSI terminalleri ANSI Escape Kodlarını destekler . Her Control Sequence Introducer( CSI) Kod aşağıdaki formatta:
ESC[<<<CODE>>>
Ascii karakteri 27( ESCkarakter) veya 1bonaltılı, ardından bir sol köşeli ayraç ve sonra kullanılacak eylemi gösteren bir harf.
;Ayrılmış parametrelerin bir listesinin doğrudan <<<CODE>>>parametreden önce sağlanabileceğini unutmayın .
Şimdi, renkler bir CSIkod alt kümesi, kodlar kullanır Select Graphic Rendition. Bunlar formda:
ESC[<<<SGR>>>m
SGRKod, bir parametre olarak geçirilir CSI. Sorunuzla ilgili SGR30-49 kodları. Kodlar 30-39 ön plan rengini ayarlar. Kod 40-49, arka plan rengini ayarlar.
30 - Foreground Black
31 - Foreground Red
32 - Foreground Green
33 - Foreground Yellow
34 - Foreground Blue
35 - Foreground Magenta
36 - Foreground Cyan
37 - Foreground White
40 - Background Black
41 - Background Red
42 - Background Green
43 - Background Yellow
44 - Background Blue
45 - Background Magenta
46 - Background Cyan
47 - Background White
Kod 38 ve 48 özel kodlardır. Bunlar RGB değerlerini kullanmanıza izin verenlerdir. Bunlar için format:
ESC[38;2;<r>;<g>;<b>m (Foreground)
ESC[48;2;<r>;<g>;<b>m (Background)
Not: alternatif kullanımlar şunları içerir \x1b[<3 or 4>8;5;<web safe color index>m. Bu kullanım ile tamamen farklı bir renk kodlaması var. Daha fazla bilgi için bu cevabın başındaki linke bakınız.
39 ve 49 kodları, ön ve arka plan renklerini, terminal bazında tanımlanmış olan varsayılan değerlerine ayarlar.
Uygulamada, renkler 30-37 40-47, etiketlerinin söylediklerinden biraz farklıdır.
0 - Black
1 - Darker Red
2 - Darker Green
3 - Dark/Yellow or Brown (varies between terminals)
4 - Dark Blue
5 - Dark Magenta
6 - Dark Cyan
7 - Light Grey
Açık renkler elde etmek için, SGI'yı kalın için kullanın 1. Kalın, yanıltıcı bir addır. Yazı tipini kalın yapmaz. Aslında metnin parlaklığını arttırır. Kalın uygulanmış renkler olur:
0 - Dark Grey
1 - Bright Red
2 - Bright Green
3 - Bright Yellow
4 - Bright Blue
5 - Bright Magenta
6 - Bright Cyan
7 - White
Dikkat: son iki renk bloğu numaraları hem ön hem de arka planla ilgilidir ( <index> + (30 or 40)).
Tüm stilleri kaldırmak için (varsayılan / normal moda geri dön) SGR0 kullanın .
CSIkodların hepsi grafik değildir. Örneğin, ESC[2Jterminalinizi temizleyecektir. ESC[<y>;<x>Himleç konumunu ayarlar (1 indeksli). Daha fazla bilgi için wikipedia makalesine bakın.
Not: Bunları test etmek için echo -eveya tuşlarını kullanın printf.
NOT: "^ [", çıkış karakteridir ve CTRL-V, CTRL- [ve ^ G ile eklenmiş bir zil karakteridir; CTRL-V, CTRL-G ile eklenmiş
Aşağıdaki blok benim .bash_profile dosyamda ve bu sistemdeki xterms'imin renklerimi değiştirebilecek başka bir sisteme giriş yaptıktan sonra bile HER ZAMAN siyah beyaz olmasını sağlıyor.
perl -e '$e=chr(27);print "${e}[37m ${e}[40m ${e}[2J ${e}[1;1H";'
export PS1='^[[37m^[]0;${HOST}: ${PWD}^G^[[40m${USER}@${HOST}:${PWD}
--> '
Ayrıca ScriptEchoColor projesini de kontrol edin
, burada
ubuntu için paketleri bulunan bash scriptlerinde tamamen yapılır
ancak nasıl yapılacağını biliyorsanız (bu komut en son sayfasından da indirilebilir).
kısaltılmış veya uzatılmış renk adlarını kullanabilirsiniz:
echoc "@rRedFg@{/blue}BlueFg@{/GREEN}GreenBg"
Bir örnek:

Ayrıca, xtermcontrol'e bir göz attığınızdan emin olun , xterm üzerinde daha kapsamlı bir kontrol sağlamak için (sadece karakterler değil).
ANSI CSI kodları arasında SGR denilen bir tane veya Grafik Seçimi Seçin. Bu, ESC'dir, [parametreler, mparametrelerin ASCII formatında bir veya daha fazla tam sayı olduğu, noktalı virgüllerle ayrılmış. Birçok farklı SGR parametresi yukarıdaki Vikipedi sayfasında listelenmiştir (her şey için tam olarak ayrıntıya girmese de).
Gibi bazı parametreler 1(kalın veya daha yüksek yoğunluk) ve 31(kırmızı metin) tek başına, ve tek tek veya kombine olarak edilebilir ESC[31mya da ESC[1;31msırasıyla standart kırmızı ve koyu kırmızı ön metni elde edildi.
Diğerleri, kodlardan sonra daha noktalı virgülle ayrılmış sayılar olarak sağlanan parametreleri kendileri alır. Örneğin, ESC[38;5;219mön plan metnini 219 genişletilmiş renkli sayısında ESC[38;2;150;100;50mgörüntüler ve bunu 150, 100, 50 RGB değerine sahip renkli olarak görüntüler 38. bir alt komut. Alt komut 2, kırmızı, yeşil ve mavi bileşenlerin değerleri olan üç parametre alır. Farklı olarak, alt komut 5terminalin yapılandırıldığı bir tablodan bir renk belirten 0 ile 255 arasında bir sayı, sadece bir değer alır.
Aşağıdaki kabuk işlevi bu kodları kullanmak için kullanışlı olabilir:
sgr() {
local codes=${1:-0}; shift
for c in "$@"; do codes="$codes;$c"; done
echo -n -e "\e[${codes}m"
}
Bu şekilde kullanabilirsiniz:
normal=$(sgr 0)
red=$(sgr 31)
echo "Text can be $(sgr 1)made boldface$(sgr 0)" \
" or ${red}colored red${normal}" \
" or $(sgr 31 1)even both at the same time$(sgr)."
sgr()Varsayılan olarak SGR kod 0'a parametre vermezseniz , tüm özellikleri devre dışı bırakmak anlamına gelir, metni o terminal için varsayılan değerden sıfırlamak anlamına gelir.
ESC[38... mve ESC[38... mkutu / should (bilgilerinizde kaynağına bağlıdır - nihai bir varlık, ben inanıyorum, itu.int/rec/T-REC-T.416-199303-I ) kullanmalıdır, aksi takdirde, karakter :( parametre elemanlarını ayırmak için ) öyle ki ;sadece tam parametre dizeleri arasında kullanılır - yani ESC[38;2;150;100;50myazılmalıdır ESC[38:2::150:100:50m...
2150;