更少地模拟 TTY 以保留管道颜色输出

更少地模拟 TTY 以保留管道颜色输出

当您通过 管道传输某些内容时less,程序通常会丢弃颜色代码,因为它不会输出到 TTY。因此您必须添加--color=always选项才能使其正常工作。

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

更糟糕的是,有时甚至不支持该选项,因此实际上没有办法强制将颜色输出到管道。

有没有一种(相对)简单的方法可以让 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

但是,没有任何方法可以让 less 分配一个 pty,因此依赖 TTY 来决定是否输出颜色的程序需要手动告知。抱歉。

相关内容