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

Moh*_*ani 31 command-line less

当我在没有寻呼机的情况下运行程序(例如grepls)时,其输出是彩色的。但是,当我运行它时,它的输出通过管道传输到less,没有显示颜色。

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

grep -r something
Run Code Online (Sandbox Code Playgroud)

但这不是:

grep -r something | less
Run Code Online (Sandbox Code Playgroud)

为什么?我怎样才能看到颜色less

Oli*_*Oli 46

这里有两个问题:

  • 诸如ls自动检测颜色支持之类的命令无法从管道中找到支持
  • less 默认设置为仅显示颜色代码。

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

ls --color=always | less -R
Run Code Online (Sandbox Code Playgroud)

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


更深入的答案是ls检查其 STDOUT 是否属于真实终端。当您通过管道传递信息时,STDOUT 被设置为下一个命令的 STDIN。

您可以ls源代码中看到这一点。它使用isatty命令(一个核心 POSIX 接口)来确定情况是什么:

  • 默认情况下是否启用颜色:

        print_with_color = (i == color_always
                            || (i == color_if_tty
                                && isatty (STDOUT_FILENO)));
    
    Run Code Online (Sandbox Code Playgroud)
  • 我们是否尝试在多列中输出:

    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;
      }
    
    Run Code Online (Sandbox Code Playgroud)

grep做一个非常相似的事情,除非明确覆盖,否则它会检测颜色支持,使用isatty

color_option = isatty (STDOUT_FILENO) && should_colorize ();
Run Code Online (Sandbox Code Playgroud)

  • @alex ack 有一个 `--color` 参数:`ack-grep -i select --color | 少-R` (3认同)
  • @B1KMusic 我同意。我非常同意,我发现了它是如何工作的并更新了答案。您可以使用“-C”参数强制列。 (2认同)