![如何使输出颜色“更少”?](https://linux22.com/image/856369/%E5%A6%82%E4%BD%95%E4%BD%BF%E8%BE%93%E5%87%BA%E9%A2%9C%E8%89%B2%E2%80%9C%E6%9B%B4%E5%B0%91%E2%80%9D%EF%BC%9F.png)
当我运行一个没有分页器的程序(例如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 是分页器 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
使用|&
而不是|
可能是不必要的细节,但这意味着 STDERR 将被传输到 less 以及 STDOUT。