Di mana kode melarikan diri ANSI saya pergi ketika saya pipa ke proses lain? Bisakah saya menyimpannya?

36

Saya kadang-kadang ingin menyalurkan output kode warna dari suatu proses, misalnya. grep ... tetapi ketika saya menyalurkannya ke proses lain, mis. sed, kode warna hilang ...

Apakah beberapa cara untuk menjaga kode ini tetap utuh?

Berikut adalah contoh yang kehilangan output berwarna:

echo barney | grep barney | sed -n 1,$\ p   
Peter.O
sumber
4
PS .. sebagai info umum .. Saya baru saja menemukan bahwa lessdapat menerima input teks berwarna (bagus :) ... misalnya: tree -C ~/ |less -Ratauls -lR --color=always . |less -R
Peter.O

Jawaban:

40

Banyak program yang menghasilkan keluaran berwarna mendeteksi jika mereka menulis ke TTY, dan mematikan warna jika tidak. Ini karena kode warna mengganggu ketika Anda hanya ingin menangkap teks, jadi mereka mencoba untuk "melakukan hal yang benar" secara otomatis.

Cara paling sederhana untuk menangkap keluaran warna dari program seperti itu adalah menyuruhnya menulis warna meskipun tidak terhubung ke TTY. Anda harus membaca dokumentasi program untuk mengetahui apakah ia memiliki opsi itu. (misalnya, grepmemiliki --color=alwaysopsi.)

Anda juga dapat menggunakan expectskrip unbufferuntuk membuat pseudo-tty seperti ini:

echo barney | unbuffer grep barney | sed -n 1,$\ p
cjm
sumber
2
terima kasih atas info tentang deteksi TTY dan pembatalan unbuffer!
shellter
@ cjm .. Ini tidak berfungsi di sini (di Ubuntu 10.04 / bash 4.1.5) ... tapi repo 10.04 saya hanya memiliki versi -dev, dan tidak ada di backports ... Ini agak terlambat di sini, jadi saya akan melihat lagi besok ... tetapi seperti yang telah Anda katakan, program pewarnaan ini mungkin beralih sesuai dengan tujuan keluaran (mhhh tapi bagaimana mereka tahu itu akan berlaku untuk tty..tidak masalah) .. dan mereka mungkin memiliki pilihan untuk memaksa itu .. terima kasih ,,,
Peter.O
@ Fred, mereka biasanya menggunakan isatty untuk mencari tahu ke mana stdoutharus pergi. Saya tidak benar-benar yakin apakah unbufferberfungsi ketika Anda memasukkan program ke dalam juga keluar dari itu; Saya belum menginstalnya di sini untuk mencoba.
cjm
terima kasih atas unbufferinformasinya, ini membantu keluaran bot IRC saya seperti keluaran di shell.
LiuYan 刘 研
4

Ini bekerja untuk saya; -! (di lingkungan MingW saat ini)

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

# barney ditampilkan sebagai teks merah

$ grep --version
GNU grep 2.5.4

$ sed --version
GNU sed version 4.2.1
kerang
sumber
@shellter ... ya, contoh grep khusus ini bekerja untuk saya juga .. Saya tidak mengetahui opsi itu sampai Anda memposting jawabannya, jadi terima kasih untuk itu ... Namun. Saya masih bertanya-tanya apakah ada beberapa cara umum untuk melakukan ini .... misalnya tree is colorized a-la dircolors if the LS_COLORS environment variable is set and output is to tty ... Mungkin (?) Ada cara untuk menipu pipa agar berpikir itu adalah keluaran ke TTY .. atau solusi umum semacam itu. .
Peter.O
Saya baru saja memeriksa man tree... Ini juga memiliki opsi serupa, -C... mungkin itu adalah fitur umum untuk program yang menampilkan kode pelarian warna ..
Peter.O