Apakah ada beberapa variabel lingkungan?
Iya. Itu adalah TERM
variabel lingkungan. Ini karena ada beberapa hal yang digunakan sebagai bagian dari proses pengambilan keputusan.
Sulit untuk menggeneralisasi di sini, karena tidak semua program menyetujui satu alur keputusan tunggal. Sebenarnya GNU grep
, yang disebutkan dalam jawaban M. Kitt, adalah contoh yang baik dari pencilan yang menggunakan proses keputusan yang agak tidak biasa dengan hasil yang tidak terduga. Secara umum, oleh karena itu:
- Output standar harus berupa perangkat terminal, sebagaimana ditentukan oleh
isatty()
.
- Program harus dapat melihat catatan untuk tipe terminal dalam termcap / terminfo database.
- Jadi karena itu harus ada tipe terminal untuk mencari. The
TERM
variabel lingkungan harus ada dan nilainya harus sesuai catatan database.
- Oleh karena itu harus ada database terminfo / termcap. Pada beberapa implementasi dari subsistem, lokasi database termcap dapat ditentukan menggunakan
TERMCAP
variabel lingkungan. Jadi pada beberapa implementasi ada variabel lingkungan kedua .
- Catatan termcap / terminfo harus menyatakan bahwa jenis terminal mendukung warna. Ada
max_colors
bidang dalam terminfo. Ini tidak diatur untuk tipe terminal yang sebenarnya tidak memiliki kemampuan warna. Memang, ada konvensi terminfo bahwa untuk setiap jenis terminal colourable ada catatan lain dengan -m
atau -mono
ditambahkan ke nama yang tidak menyatakan kemampuan warna.
- Catatan termcap / terminfo harus menyediakan cara bagi program untuk mengubah warna. Ada
set_a_foreground
dan set_a_background
bidang dalam terminfo.
Ini sedikit lebih kompleks dari sekedar memeriksa isatty()
. Hal ini semakin rumit dengan beberapa hal:
- Beberapa aplikasi menambahkan opsi baris perintah atau flag konfigurasi yang mengesampingkan
isatty()
pemeriksaan, sehingga program selalu atau tidak pernah mengasumsikan bahwa ia memiliki terminal (colourable) sebagai outputnya. Sebagai contoh:
- GNU
ls
memiliki --color
opsi baris perintah.
- BSD
ls
melihat variabel lingkungan CLICOLOR
(tidak adanya artinya tidak pernah ) dan CLICOLOR_FORCE
(keberadaannya selalu berarti ), dan juga menggunakan -G
opsi baris perintah.
- Beberapa aplikasi tidak menggunakan termcap / terminfo dan memiliki tanggapan bawaan untuk nilai
TERM
.
- Tidak semua terminal menggunakan urutan SGR-ECMA-48 atau ISO 8613-6, yang sedikit dinamai "ANSI escape sequence", untuk mengubah warna. Mekanisme termcap / terminfo sebenarnya dirancang untuk melindungi aplikasi dari pengetahuan langsung dari urutan kontrol yang tepat. (Selain itu, ada argumen yang bisa diambil bahwa tidak ada yang menggunakan urutan ISO 8613-6 SGR, karena semua orang setuju pada bug menggunakan semi-kolon sebagai pembatas untuk urutan warna SGR RGB. Standar sebenarnya menentukan usus besar.)
Seperti disebutkan, GNU grep
sebenarnya menunjukkan beberapa kompleksitas tambahan ini. Itu tidak berkonsultasi termcap / terminfo, hardware urutan kontrol untuk memancarkan, dan hardware respon TERM
terhadap variabel lingkungan.
The Linux / Unix pelabuhan itu memiliki kode ini , yang memungkinkan colourization hanya ketika TERM
variabel lingkungan ada dan nilainya tidak sesuai dengan nama bawaan dumb
:
int
should_colorize (batal)
{
char const * t = getenv ("TERM");
return t && strcmp (t, "dumb")! = 0;
}
Jadi bahkan jika Anda TERM
yaitu xterm-mono
, GNU grep
akan memutuskan untuk warna memancarkan, meskipun program lain seperti vim
tidak akan.
The Win32 pelabuhan itu memiliki kode ini , yang memungkinkan colourization baik ketika TERM
variabel lingkungan tidak ada atau ketika ada dan nilainya tidak sesuai dengan nama bawaan dumb
:
int
should_colorize (batal)
{
char const * t = getenv ("TERM");
kembali! (t && strcmp (t, "dumb") == 0);
}
grep
Masalah GNU dengan warna
grep
Pewarnaan GNU sebenarnya terkenal. Karena itu tidak benar-benar melakukan pekerjaan yang tepat untuk membangun keluaran terminal, tetapi lebih dari hanya mengacaukan dalam beberapa urutan kontrol bawaan pada berbagai titik dalam outputnya dengan harapan sia-sia bahwa itu cukup baik, itu sebenarnya menampilkan output yang salah dalam keadaan tertentu.
Keadaan ini adalah di mana ia harus mewarnai sesuatu yang berada di margin kanan terminal. Program yang melakukan keluaran terminal dengan benar harus memperhitungkan margin kanan otomatis. Selain kemungkinan kecil bahwa terminal mungkin tidak memilikinya (yaitu auto_right_margin
bidang dalam terminfo), perilaku terminal yang memiliki margin kanan otomatis sering mengikuti DEC VT preseden dari pembungkus garis pending . GNU grep
tidak memperhitungkan ini, naif mengharapkan bungkus garis langsung , dan output berwarna salah.
Output berwarna bukanlah hal yang sederhana.
Bacaan lebih lanjut