如何制作“更少”的输出颜色?

当我在没有寻呼机的情况下运行程序(例如grepls )时,其输出是彩色的。 然而,当我运行它将其输出管道输出到less ,不会显示任何颜色。

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

 grep -r something 

但这不是:

 grep -r something | less 

为什么? 如何通过less颜色看到颜色?

这里有两个问题:

  • ls -which这样的命令会自动检测颜色支持 – 找不到管道的支持
  • less设置为默认显示颜色代码。

两者都可以克服,但它有点笨重:

 ls --color=always | less -R 

这不是具体的。 许多支持颜色的命令也有一个覆盖参数。


稍微深入一点的答案是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 (); 

如果您对颜色less感兴趣,可能需要查看lesspipe.sh 。 例如,请参阅http://freecode.com/projects/lesspipe 。

lesspipe.sh是寻呼机的输入filter,如less的手册页中所述。 该脚本在兼容ksh的shell(例如bash,zsh)下运行,并允许您使用less来查看包含在存档中的二进制内容,压缩文件,存档和文件的文件。

它还将类似于文本编辑器对shell脚本,perl脚本等进行着色,但不使用任何“预处理”程序来进行着色。