Başka bir işleme yönlendirdiğimde ANSI çıkış kodlarım nereye gidiyor? Onları saklayabilir miyim?


36

Bazen renk kodlu çıktı frorlarını bir işlemle borulamak istiyorum, örneğin. grep ... ama başka bir işleme koyduğum zaman, ör. sed, renk kodları kayboluyor ...

Bu kodları sağlam tutmanın bir yolu var mı?

Renkli çıktısını kaybeden bir örnek:

echo barney | grep barney | sed -n 1,$\ p   

4
PS .. genel bilgi olarak .. lesstree -C ~/ |less -Rls -lR --color=always . |less -R
Renklendirilmiş

Yanıtlar:


40

Renkli çıktı üreten birçok program, bir TTY'ye yazıp yazmadıklarını algılar ve değilse, renkleri kapatın. Bunun nedeni, yalnızca metni yakalamak istediğinizde renk kodlarının can sıkıcı olmasıdır, bu nedenle otomatik olarak "doğru olanı yapmayı" denerler.

Böyle bir programdan renk çıktısını almanın en basit yolu, bir TTY'ye bağlı olmasa bile, renk yazmasını söylemektir. Bu seçeneğe sahip olup olmadığını öğrenmek için programın belgelerini okumak zorunda kalacaksınız. (örneğin grepsahiptir --color=alwaysseçeneği.)

Ayrıca böyle bir sözde tty oluşturmak için expectbetiği de kullanabilirsiniz unbuffer:

echo barney | unbuffer grep barney | sed -n 1,$\ p

2
TTY tespiti ve çözümsüzlük sahtekarlığı hakkındaki bilgi için teşekkürler!
shellter,

@cjm .. Burada çalışmıyor (Ubuntu 10.04 / bash 4.1.5'de) ... ama 10.04 depomda yalnızca -dev sürümü var ve desteklerinde hiçbir şey yok ... Biraz geç, bu yüzden bakacağım yine yarın ... ama sizin de dediğiniz gibi, bu renklendirme programları muhtemelen çıkış hedefine göre değişiyor (mhhh ama bunun tty 'nin ne kadar iyi gittiğini nasıl biliyorlar? önemli değil). it .. thanks ,,,
Peter.O

@fred, genellikle nereye gittiğini bulmak için isatty kullanıyorlar stdout. unbufferProgramın yanı sıra programın içine bağlanırken de işe yarayıp yaramadığından emin değilim ; Denemek için buraya yüklü değil.
cjm

unbufferbilgi için teşekkürler , bu benim IRC bot çıkış kabuk gibi çıkış yardımcı olur.
LiuYan,

4

Benim için çalışıyor; (mevcut MingW ortamında)

echo barney | grep --color=always barney | sed -n '1,$p'
**barney**

# barney kırmızı metin olarak görüntüleniyor

$ grep --version
GNU grep 2.5.4

$ sed --version
GNU sed version 4.2.1

@shellter ... evet, bu özel grep örneği benim için de işe yarıyor .. Siz cevabı yayınlayana kadar bu seçeneğin farkında değildim, bu yüzden teşekkürler ... Ancak. Bunu yapmanın genel bir yolu olup olmadığını hala merak ediyorum .... örneğin tree is colorized a-la dircolors if the LS_COLORS environment variable is set and output is to tty ... Belki (?) Bir TTY'ye veya bunun gibi genel bir geçici çözüme yol açtığını düşünerek bir boruyu kandırmanın bir yolu vardır. .
Peter.O

Ben sadece kontrol ettim man tree... Bu da benzer bir seçeneğe sahip, -C... belki de renk kaçış kodları çıkaran programlar için ortak bir özelliktir ..
Peter.O
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.