Apa yang dilakukan oleh saklar grep --color = auto?

8

Apa efek autoyang dimiliki opsi untuk --colorswitch pada grep? Kapan grep memutuskan untuk mewarnai string yang cocok, dan kapan bukan?

Trolzen
sumber

Jawaban:

12

Perilaku yang diharapkan

Dengan --color=auto, grep akan menyoroti string yang cocok jika (dan hanya jika) output ditulis langsung ke terminal dan terminal tersebut mampu menampilkan output berwarna.

Biasanya, --color=autoitulah yang Anda inginkan. Jika, misalnya, Anda menggunakan grep untuk mencocokkan URL dan mengirimkannya ke Wget, Wget akan melihat \e[1;31mhttp://...alih-alih URL yang sebenarnya (dan mencekiknya).

Perintah berikut ini akan menghasilkan keluaran berwarna:

echo Super User | grep --color=auto Super
echo Super User | grep --color=always Super | cat

Namun, perintah ini seharusnya tidak:

echo Super User | grep --color=auto Super | cat

Setiap ketidakkonsistenan dengan perilaku ini harus dianggap sebagai bug.

Kode sumber

Dengan --color=auto, versi Grep for Windows terbaru (2.5.4) - serta 2.5.4 yang asli didasarkan pada - warna output jika dan hanya jika kondisinya

isatty(STDOUT_FILENO) && getenv("TERM") && strcmp(getenv("TERM"), "dumb")

benar, yaitu, jika dan hanya jika output sedang ditulis ke terminal, variabel lingkunganTERM didefinisikan dan terminal tidak bodoh .

Ini tidak akan menghasilkan perilaku yang diinginkan di bawah Windows, karena TERMbiasanya tidak didefinisikan. Solusi mudah untuk masalah ini adalah mengatur TERM=windowsdi panel kontrol.

Versi terbaru dari grep (2.14) memperbaiki masalah ini dengan mewarnai keluaran jika dan hanya jika kondisinya

isatty(STDOUT_FILENO) && should_colorize()

benar, di mana should_colorize()didefinisikan berbeda untuk POSIX dan Win32:

Untuk yang pertama, kondisinya setara dengan yang ada di 2.5.4; untuk yang terakhir, variabel lingkungan TERMtidak harus ditetapkan (hanya tidak bisa dumb).

Dennis
sumber
Bagaimana cara mengetahui apakah ia menulis ke terminal atau tidak?
Trolzen
1
Ada fungsi C untuk itu. Jika Anda menyertakan file header sdgstd.h, istty(stdout)kembali 0jika output diarahkan ke file.
Dennis
Saya bereksperimen dengan port windows dari grepdan lessdari proyek GnuWin (gnuwin32.sourceforge.net). cmd.exeditingkatkan dengan ansiconutilitas. less --color=autoberfungsi seperti yang diharapkan: menggunakan warna saat tidak ada redirection yang diterapkan dan tidak ketika output diarahkan. Tetapi grep --color=autotidak mencetak urutan melarikan diri dalam kedua kasus.
Trolzen
Saya tidak mengerti mengapa ini terjadi. Saya pikir utilitas ini memiliki kode yang sama baik di versi unix dan windows dan mereka sudah cukup tua. Jadi mereka harus berperilaku identik.
Trolzen
Itu bug di grep GnuWin32 lalu. Di Ubuntu, berperilaku seperti yang saya terinci dalam jawaban saya. Meskipun keduanya berasal dari kode sumber yang sama, selalu ada penyesuaian kecil yang harus dilakukan jika Anda akan melakukan kompilasi pada platform lain. Juga, perlu diingat bahwa versi grep GnuWin32 saat ini adalah 2.5.4. Versi terbaru pada Ubuntu adalah 2.12.
Dennis