如何制作“更少”的输出颜色?
当我在没有寻呼机的情况下运行程序(例如grep
或ls
)时,其输出是彩色的。 然而,当我运行它将其输出管道输出到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脚本等进行着色,但不使用任何“预处理”程序来进行着色。