Bagaimana cara membuat warna keluaran `less`?


25

Ketika saya menjalankan suatu program (misalnya grepatau ls) tanpa pager, hasilnya berwarna. Namun ketika saya menjalankannya piping outputnya less, tidak ada warna yang ditampilkan.

Sebagai contoh, perintah ini menampilkan keluaran berwarna:

grep -r something

tetapi ini tidak:

grep -r something | less

Mengapa? Bagaimana saya bisa melihat warna less?


5
grep --color=always "search string" * | less -Rtapi saya cenderung menggunakannya mostsaat ini less. JUGA: gnu.org/software/src-highlite adalah stabilo warna (kurang karya juga)
Rinzwind

@alex sudahkah Anda menginstal python-pygments?
souravc

@souravc tidak, saya tidak menginstalnya
Mohammad Reza Rezwani

@ales mengabaikanku kan? >: - D
Rinzwind

Jawaban:


36

Ada dua masalah disini:

  • Perintah seperti ls— yang secara otomatis mendeteksi dukungan warna — tidak menemukan dukungan dari pipa
  • less diatur untuk hanya menampilkan kode warna secara default.

Keduanya bisa diatasi tetapi agak kikuk:

ls --color=always | less -R

Ini tidak lsspesifik. Banyak perintah yang mendukung warna juga memiliki argumen override.


Jawaban yang sedikit lebih dalam lsadalah memeriksa apakah STDOUT milik terminal nyata atau tidak. Ketika Anda menyambungkan berbagai hal, STDOUT diatur ke STDIN dari perintah selanjutnya.

Anda dapat melihat ini sedang bekerja dalam lskode sumber . Menggunakan isattyperintah (antarmuka POSIX inti) untuk mengetahui situasinya:

  • Apakah warna diaktifkan secara default:

        print_with_color = (i == color_always
                            || (i == color_if_tty
                                && isatty (STDOUT_FILENO)));
    
  • Apakah kami mencoba menampilkan dalam beberapa kolom:

    if (format == long_format)
      format = (isatty (STDOUT_FILENO) ? many_per_line : one_per_line);
    
    //...
    
    if (isatty (STDOUT_FILENO))
      {
        format = many_per_line;
        set_quoting_style (NULL, shell_escape_quoting_style);
        qmark_funny_chars = true;
      }
    else
      {
        format = one_per_line;
        qmark_funny_chars = false;
      }
    

grepmelakukan hal yang sangat mirip, kecuali diganti secara eksplisit, itu akan mendeteksi dukungan warna, dengan isatty:

color_option = isatty (STDOUT_FILENO) && should_colorize ();

1
Suara positif terakhir saya (mencapai batas) untuk hari ini untuk mendukung Anda untuk 100rb. Tapi aku dan Rinzwind ingin kue ketika itu terjadi.
hytromo

Saya mengunduh program dengan nama ack-grep. ketika mengetik ack-grep foo, ia akan mencari foo di semua sub direktori. Jadi saya melakukan ack-grep foo | kurang, dan warna hilang. Tetapi tampaknya program ini tidak mendukung "--color = always", apa pun terima kasih atas bantuannya
Mohammad Reza Rezwani

1
@alex ack memiliki --colorargumen:ack-grep -i select --color | less -R
Oli

@Oli ......... Ya Tuhan ........ satu-satunya hal yang bisa saya katakan tentang pengetahuan dan bantuan Anda dan juga kekuatan linux
Mohammad Reza Rezwani

1
@ B1KMusic Saya setuju. Saya setuju begitu banyak yang saya temukan bagaimana cara kerjanya dan diperbarui jawabannya. Anda bisa memaksa kolom dengan -Cargumen.
Oli

2

Jika Anda tertarik pada warna secara lesslebih umum, Anda mungkin ingin melihatnya lesspipe.sh. Lihat, misalnya, http://freecode.com/projects/lesspipe .

lesspipe.sh adalah filter input untuk pager kurang seperti yang dijelaskan dalam halaman manual less. Script berjalan di bawah shell yang kompatibel dengan ksh (mis. Bash, zsh) dan memungkinkan Anda menggunakan lebih sedikit untuk melihat file dengan konten biner, file terkompresi, arsip, dan file yang terkandung dalam arsip.

Ini juga akan mewarnai skrip shell, perl skrip, dll. Mirip dengan editor teks, tetapi tanpa menggunakan program "preprocessing" untuk melakukan pewarnaan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.