
當我在沒有尋呼機的情況下運行程式(例如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。