Pertahankan warna saat disalurkan ke tee

62
ls -l --color=auto | tee output.log

Tanpa pipa / tee warnanya. Bagaimana saya bisa membuatnya agar tetap berwarna saat menggunakan tee(hanya bisa diwarnai di layar, saya tidak peduli tentang warna dalam log).

Paweł Gościcki
sumber

Jawaban:

84

Cukup masukkan unbuffersebelum perintah apa saja untuk membuatnya berpikir itu menulis ke output interaktif bahkan jika itu sebenarnya piping ke executable lain. Ini akan mempertahankan warna dalam kasus ls.

Sebagai contoh

unbuffer ls -l --color=auto | tee output.log

Jika Anda belum menginstalnya, pada Ubuntu dan distribusi Linux Debian-ish lainnya Anda dapat menginstal unbufferdengan melakukan.

sudo apt-get install expect-dev
Eamonn O'Brien-Strain
sumber
6
Solusi lain, yang tidak memerlukan instalasi apa pun, adalah di stackoverflow.com/questions/3515208/…
Tgr
3
Ini menyebabkan file yang dihasilkan berisi kode warna (tentu saja); apakah ada cara untuk mencetak file dengan cara yang menggunakan kode warna dan menampilkan warna di terminal dengan benar?
Kyle Strand
2
Ugh, itu membuat entri kata sandi menunjukkan kata sandi Anda di teks lengkap!
AndiDog
@ Tgr Solusi itu tidak berhasil bagi saya di OS X mencoba untuk mendapatkan output berwarna mentah xcodebuild- sebagai gantinya saya mendapat garis cincang tanpa warna. unbuffer xcodebuild | less -RNamun, bekerja dengan sempurna.
Slipp D. Thompson
2
Anda tidak membutuhkan expect-devpaket itu. expectcukup.
Yajo
11

Gunakan opsi ls --color=always

--color=auto tidak akan mewarnai output ke pipa - untuk alasan yang jelas.

Halaman utama mengatakan sebagai berikut:

Dengan --color = auto, kode warna hanya keluaran jika keluaran standar terhubung ke terminal (tty).

RedGrittyBrick
sumber
2
BAIK. Itu menjelaskannya. Tapi bisakah saya masih bisa melihat warna di layar? (Lagipula itu TTY). Saya tidak keberatan TIDAK memilikinya di logfile, tapi saya pasti ingin mereka ada di layar saya.
Paweł Gościcki
Saya pikir saya membuat diri saya tidak cukup jelas. ls -lhanyalah sebuah contoh. Saya memiliki perintah yang sama sekali berbeda (log heroku) yang menghapus warna saat disalurkan ke tee. Dan saya ingin "memperbaiki / mengubah" tee / pipa, bukan perintah yang saya jalankan.
Paweł Gościcki
1
@ Pamel, Anda tidak dapat dengan mudah memperbaikinya di tee / pipa karena tee / pipa tidak melucuti kode warna ini. Masalahnya adalah bahwa perintah awal melihatnya bukan menulis ke terminal. Anda memerlukan pseudo-terminal yang bertindak seperti pipa tetapi perintah yang melihat sebagai terminal.
RedGrittyBrick
Hm ... cukup adil. Saya kira saya hanya perlu menerima bahwa memang begitulah adanya.
Paweł Gościcki
3
@ PawełGościcki jawaban ini hanya untuk memperbaiki masalah ls. Lihat jawaban saya yang memperbaiki masalah untuk semua program, termasuk log heroku.
Eamonn O'Brien-Strain
3

Saya akan memperluas scriptsolusi yang diberikan dalam komentar dari jawaban yang diterima. Menggunakan scriptmungkin berguna jika Anda tidak bisa atau tidak ingin menginstal paket harapan yang berisi unbufferperintah.

Cetak ls output ke stdout dan file dengan kode warna :

script -efq output.log -c "ls -l --color=auto"

dimana ( man script):

  -e, --return
         Return the exit code of the child process.  Uses the same
         format as bash termination on signal termination exit code is 128+n.
  -f, --flush
         Flush output after each write.  This is nice for telecooperation:
        one person does `mkfifo foo; script -f foo', and another can 
        supervise real-time what is being done using `cat foo'.
  -q, --quiet
         Be quiet (do not write start and done messages to either 
         standard output or the typescript file).

Lihat file keluaran dengan warna:

less -r output.log
Juuso Ohtonen
sumber
2
-esama dengan --return- tidak perlu untuk keduanya; -efqadalah --return --flush --quiet.
Noel Maersk
@NoelMaersk Terima kasih. Saya memasukkan penjelasan parameter dalam jawabannya.
Juuso Ohtonen