Bazı ortam değişkenleri var mı?
Evet. Öyle TERM
ortam değişkeni. Bunun nedeni, karar sürecinin bir parçası olarak kullanılan birkaç şey olmasıdır.
Burada genelleme yapmak zordur, çünkü tüm programlar tek bir karar akış şeması üzerinde anlaşamazlar. Aslında grep
M. Kitt'in cevabında değinilen GNU , beklenmedik sonuçlarla biraz alışılmadık bir karar süreci kullanan bir aykırı durumun iyi bir örneğidir. Çok genel anlamda, bu nedenle:
- Standart çıkış, belirlendiği gibi bir terminal cihazı olmalıdır
isatty()
.
- Program, termcap / terminfo veritabanındaki terminal tipi için kaydı arayabilmelidir.
- Bu nedenle , aramak için bir terminal tipi olmalıdır .
TERM
Çevre değişkeni bulunmalı ve kendi değer bir veritabanı kaydı aynı olmalıdır.
- Bu nedenle bir terminfo / termcap veritabanı olmalıdır. Alt sistemin bazı uygulamalarında, termcap veritabanının yeri bir
TERMCAP
ortam değişkeni kullanılarak belirtilebilir . Bazı uygulamalarda ikinci bir ortam değişkeni vardır.
- Termcap / terminfo kaydı, terminal tipinin renkleri desteklediğini belirtmelidir.
max_colors
Terminfoda bir alan var . Aslında renk özellikleri olmayan terminal türleri için ayarlanmamıştır. Gerçekten de, her renklendirilebilir terminal türü için, herhangi bir renk yeteneği belirtmeyen adla birlikte eklenen -m
veya -mono
adın sonuna eklenen başka bir kayıt vardır .
- Termcap / terminfo kaydı, programın renk değiştirmesine yol açmalıdır. Terminfoda
set_a_foreground
ve set_a_background
alanlar var .
Sadece kontrol etmekten biraz daha karmaşık isatty()
. Bu hale getirilebileceğini ileri birkaç şeyden karmaşık:
- Bazı uygulamalar,
isatty()
denetimi geçersiz kılan komut satırı seçenekleri veya yapılandırma bayrakları ekler , böylece program her zaman veya hiçbir zaman çıktısı olarak (renklendirilebilir) bir terminale sahip olduğunu varsayar. Örneğin:
- GNU
ls
sahiptir --color
komut satırı seçeneği.
- BSD
ls
, CLICOLOR
( hiç olmadığı anlamsızlığı ) ve CLICOLOR_FORCE
( her zaman anlamı anlamına gelen ) ortam değişkenlerine bakar ve ayrıca -G
komut satırı seçeneğini kullanır.
- Bazı uygulamalar termcap / terminfo kullanmaz ve değerine kablolu yanıtlar verir
TERM
.
- Tüm terminaller, renkleri değiştirmek için "ANSI kaçış dizileri" olarak biraz yanlış adlandırılan ECMA-48 veya ISO 8613-6 SGR dizilerini kullanmaz. Termcap / terminfo mekanizması aslında uygulamaları kesin kontrol dizilerinin doğrudan bilgisinden yalıtmak üzere tasarlanmıştır. (Dahası, hiç kimsenin ISO 8613-6 SGR sekanslarını kullanmadığına dair bir argüman var , çünkü herkes RGB renkli SGR sekansları için sınırlayıcı olarak yarı kolon kullanma hatasını kabul ediyor . Standart aslında kolonu belirtir.)
Belirtildiği gibi, GNU grep
aslında bu ek karmaşıklıkların bazılarını sergilemektedir. Termcap / terminfo'ya başvurmaz, yaymak için kontrol sekanslarını bağlar ve TERM
ortam değişkenine bir yanıtı kablolar .
Bunun Linux / Unix portu bu kodu vardır sadece renk oluşumuna olanak, TERM
ortam değişkeni varsa ve değeri kablolu adı eşleşmiyor dumb
:
int
renklendirmeli (geçersiz)
{
char const * t = getenv ("TERM");
dönüş t && strcmp (t, "aptal")! = 0;
}
Yani hatta eğer TERM
IS xterm-mono
, GNU grep
bile diğer programlar olsa gibi yayarlar renklerine karar verecektir vim
olmaz.
Bunun Win32 portu bu kodu vardır renk oluşumuna olanak ya zaman TERM
ortam değişkeni değil yok veya varolduğundan ve ne zaman değeri kablolu adı eşleşmiyor dumb
:
int
renklendirmeli (geçersiz)
{
char const * t = getenv ("TERM");
dönüş ! (t && strcmp (t, "aptal") == 0);
}
GNU'nun grep
Renk Sorunları
GNU'nun grep
rengi aslında kötü şöhretlidir. Aslında terminal çıkışını inşa etmek için uygun bir iş yapmadığı için, bunun yerine boşluğundaki çıkışındaki çeşitli noktalarda birkaç kablolu kontrol sekansındaki suçlamalar, bunun yeterince iyi olduğunu umar, bazı durumlarda yanlış çıktı görüntüler.
Bu koşullar, terminalin sağ kenarında bulunan bir şeyi renklendirmek zorunda olduğu yerlerdir. Terminal çıkışını düzgün yapan programların otomatik sağ kenar boşluklarını hesaba katması gerekir. Terminalin sahip olamayacağına dair küçük bir olasılığa ek olarak ( auto_right_margin
terminfodaki alanı da), otomatik sağ kenar boşluklarına sahip olan terminallerin davranışı genellikle beklemedeki hat sargısının DEC VT emsalini takip eder . GNU grep
bunu açıklamıyor, hemen satır sarmayı bekliyor ve renkli çıktısı yanlış gidiyor.
Renkli çıktı basit bir şey değildir.
daha fazla okuma