Ketika saya menjalankan perintah dari terminal yang mencetak keluaran berwarna (seperti ls
atau gcc
), keluaran berwarna dicetak. Dari pemahaman saya, proses ini sebenarnya menghasilkan kode pelarian ANSI , dan terminal memformat warna.
Namun, jika saya menjalankan perintah yang sama dengan proses lain (misalnya aplikasi C kustom) dan mengarahkan output ke output aplikasi sendiri, warna-warna ini tidak bertahan.
Bagaimana suatu program memutuskan apakah akan mengeluarkan teks dengan format warna atau tidak? 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:isatty()
.TERM
variabel lingkungan harus ada dan nilainya harus sesuai catatan database.TERMCAP
variabel lingkungan. Jadi pada beberapa implementasi ada variabel lingkungan kedua .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.set_a_foreground
danset_a_background
bidang dalam terminfo.Ini sedikit lebih kompleks dari sekedar memeriksa
isatty()
. Hal ini semakin rumit dengan beberapa hal:isatty()
pemeriksaan, sehingga program selalu atau tidak pernah mengasumsikan bahwa ia memiliki terminal (colourable) sebagai outputnya. Sebagai contoh:ls
memiliki--color
opsi baris perintah.ls
melihat variabel lingkunganCLICOLOR
(tidak adanya artinya tidak pernah ) danCLICOLOR_FORCE
(keberadaannya selalu berarti ), dan juga menggunakan-G
opsi baris perintah.TERM
.Seperti disebutkan, GNU
grep
sebenarnya menunjukkan beberapa kompleksitas tambahan ini. Itu tidak berkonsultasi termcap / terminfo, hardware urutan kontrol untuk memancarkan, dan hardware responTERM
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 bawaandumb
:Jadi bahkan jika Anda
TERM
yaituxterm-mono
, GNUgrep
akan memutuskan untuk warna memancarkan, meskipun program lain sepertivim
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 bawaandumb
:grep
Masalah GNU dengan warnagrep
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 . GNUgrep
tidak memperhitungkan ini, naif mengharapkan bungkus garis langsung , dan output berwarna salah.Output berwarna bukanlah hal yang sederhana.
Bacaan lebih lanjut
grep --color
tidak menunjukkan keluaran yang tepat ". xterm FAQ . Pulau Tak Terlihat.sumber
$TERM
tidak menjelaskan itu. (Jawaban Anda menarik secara umum, tetapi saya tidak berpikir itu menjawab pertanyaan ...)The
unbuffer
perintah dari berharap paket de-pasangan output dari program pertama dan input ke program kedua.Anda akan menggunakannya seperti ini:
Saya menggunakannya sepanjang waktu dengan ansible dan yg dibuat ctee naskah sehingga saya bisa melihat output warna pada terminal, sementara meninggalkan file log dengan normal (non-berwarna) output.
sumber