如何使輸出顏色「更少」?

如何使輸出顏色「更少」?

當我在沒有尋呼機的情況下運行程式(例如grep或)時,其輸出是彩色的。ls但是,當我運行它時,將其輸出通過管道傳輸到less,沒有顯示任何顏色。

例如,此命令輸出彩色輸出:

grep -r something

但這並沒有:

grep -r something | less

為什麼?怎樣才能透過顏色看到顏色less

答案1

這裡有兩個問題:

  • 像“自動檢測顏色支援”這樣的命令ls找不到管道的支持
  • less預設為僅顯示顏色代碼。

兩者都可以克服,但有點笨拙:

ls --color=always | less -R

這並不ls具體。許多支援顏色的命令也有一個覆蓋參數。


一個稍微更深入的答案是ls檢查它的 STDOUT 是否屬於真實終端。當您進行管道傳輸時,STDOUT 將設定為下一個指令的 STDIN。

你可以在工作中看到這個ls原始碼中。它使用isatty命令(核心 POSIX 介面)來確定情況:

  • 預設顏色是否開啟:

        print_with_color = (i == color_always
                            || (i == color_if_tty
                                && isatty (STDOUT_FILENO)));
    
  • 我們是否嘗試以多列輸出:

    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;
      }
    

grep做了非常相似的事情,除非明確覆蓋,否則它將檢測顏色支持,其中isatty

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

答案2

如果您對更廣泛的顏色感興趣less,您可能想看看lesspipe.sh。例如,參見https://github.com/wofr06/lesspipe

lesspipe.sh 是 pager less 的輸入篩選器,如 less 的手冊頁所述。該腳本在與 ksh 相容的 shell(例如 bash、zsh)下運行,並允許您使用 less 來查看具有二進位內容的檔案、壓縮檔案、存檔以及存檔中包含的檔案。

它也可以像文字編輯器一樣對 shell 腳本、perl 腳本等進行著色,但不使用任何「預處理」程式來進行著色。

答案3

@oli 的答案取決於您能夠為生成顏色的命令提供適當的標誌。如果命令隱藏在腳本等中,這可能會很困難,並且需要弄清楚如何為各種命令單獨提供適當的標誌,這些命令知道如何在終端環境允許時產生 ANSI 轉義。

@DaveEmme 的答案告訴您,您可以使用 lesspipe 對任何來源的輸出進行著色,但據我所知,當輸出到達終端時,它不會保留已生成顏色的命令的顏色。

如果您已經有一個在終端機中運行良好的命令,那麼最好能夠以這樣的方式運行該命令:無論輸出如何通過管道傳輸,都可以保留顏色轉義,這樣您就可以將其輸入到less -R.

unbuffer為你做這個。在 Debian 上至少你可以通過sudo apt install expect-dev.

然後你可以這樣做:

unbuffer [command] |& less -R

使用|&not|可能是不必要的細節,但這意味著 STDERR 會像 STDOUT 一樣透過管道傳輸到 less。

謝謝https://superuser.com/a/1260695/229226為了這。

相關內容