less 模擬 TTY 以保留管道顏色輸出

less 模擬 TTY 以保留管道顏色輸出

當您透過管道傳輸某些內容時less,程式通常會丟棄顏色代碼,因為它沒有輸出到 TTY。因此,您必須添加--color=always選項才能使其正常工作。

ls -l --color=always | less
grep -R asdf --color=always | less

更糟糕的是,有時甚至不支援該選項,因此實際上沒有辦法強制將顏色輸出到管道。

有沒有一種(相對)簡單的方法可以減少對 TTY 的模擬,這樣我就不必--color=always在將內容通過管道傳輸到每個程式時指定它,並且在可能的情況下自動顯示顏色輸出?

答案1

這並不是less需要改變的。其他程式的輸出被重定向到管道。這些程式偵測到它們的輸出沒有被送到 tty,並且它們禁用它們的著色。即使重定向到管道,您也必須對來源程式執行一些特殊操作來為其輸出著色。

我想我有一個針對不支援 --color=always 選項的程式的解決方案。該unbuffer命令創建一個 pty 並將其參數程式的輸出發送到該 pty,因此參數程式認為其輸出將發送到 tty 並將其著色。

我嘗試了以下作為實驗並且它有效。我想不出有任何程式預設為其輸出著色。

$ unbuffer ls --color=auto | cat

另外,您是否必須使用-r選項才能less使其顯示顏色?我也嘗試過這個:

$ unbuffer ls --color=auto | less -r

答案2

在 FreeBSD 上你可以:

env CLICOLOR_FORCE=yes ls -l | less -R

或者您可以設定/覆蓋選項(csh/tcsh):

alias less less -R
setenv CLICOLOR_FORCE yes
setenv  LS_COLORS "no=00:fi=00:di=01;36:ln=01;37;44:pi=40;33:so=01;35"
setenv  LS_COLORS "$LS_COLORS":"bd=40;33;01:cd=40;33;01:or=40;31;01"
setenv  LS_COLORS "$LS_COLORS":"ex=01;32;40:*.tar=01;31:*.tgz=01;31"
setenv  LS_COLORS "$LS_COLORS":"*.arj=01;31:*.taz=01;31:*.lzh=01;31"
setenv  LS_COLORS "$LS_COLORS":"*.zip=01;31:*.z=01;31:*.Z=01;31"
setenv  LS_COLORS "$LS_COLORS":"*.gz=01;31:*.deb=01;31:*.jpg=01;35"
setenv  LS_COLORS "$LS_COLORS":"*.gif=01;35:*.bmp=01;35:*.ppm=01;35"
setenv  LS_COLORS "$LS_COLORS":"*.tga=01;35:*.xbm=01;35:*.xpm=01;35"
setenv  LS_COLORS "$LS_COLORS":"*.tif=01;35:*.mpg=01;37:*.avi=01;37"
setenv  LS_COLORS "$LS_COLORS":"*.gl=01;37:*.dl=01;37:*.tex=01;35"
setenv  LS_COLORS "$LS_COLORS":"*.ps=01;35"
setenv  LS_COLORS "$LS_COLORS":"*.php=01;33"
setenv  LS_COLORS "$LS_COLORS":"*.sh=00;31"
setenv  LS_COLORS "$LS_COLORS":"*.txt=01;37:*.conf=01;37:*.config=01;37"
setenv  LSCOLORS GxExcxdxCxegedabagacad

在~/.cshrc中

答案3

如果程式用於isatty確定是否使用顏色,
一種方法是使用以下方法覆寫它LD_PRELOAD

建立一個始終傳回 true 的 isatty 版本。

echo "int isatty(int x) { (void) x; return 1 ;}" > isatty_override.c

編譯它並創建一個共享庫。

gcc -c -fPIC isatty_override.c -o isatty_override.o
gcc isatty_override.o -shared -o isatty_override.so

使用 LD_PRELOAD 環境變數載入共享庫。

LD_PRELOAD=./isatty_override.so ls -l | less

答案4

但是,沒有任何方法可以減少分配 pty,因此依賴 TTY 來決定輸出顏色或不需要手動告知的程式。對不起。

相關內容