如何使输出颜色“更少”?

如何使输出颜色“更少”?

当我运行一个没有分页器的程序(例如grep或)时,它的输出是彩色的。但是当我运行它并将其输出传输到 时,没有显示任何颜色。lsless

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

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。

谢谢https://superuser.com/a/1260695/229226为了这。

相关内容