如何减少输出颜色?


25

当我运行没有寻呼机的程序(例如grepls)时,其输出将显示为彩色。但是,当我将其输出管道输送到时less,没有显示颜色。

例如,以下命令输出彩色输出:

grep -r something

但这不是:

grep -r something | less

为什么?我如何看穿颜色less


5
grep --color=always "search string" * | less -R但是我现在倾向于用most而不是less。还:gnu.org/software/src-highlite是一种彩色荧光笔(作品也较少)
Rinzwind 2014年

@alex是否已安装python-pygments
souravc 2014年

@souravc否,我没有安装
Mohammad Reza Rezwani 2014年

@ales无视我是我们吗?>:-D
Rinzwind 2014年

Answers:


36

这里有两个问题:

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

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

ls --color=always | less -R

这不是ls特定的。许多支持color的命令也具有override参数。


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

1
我今天的上次投票(达到上限)为您提供了10万美元的支持。但是发生这种情况时,我和Rinzwind想要蛋糕。
hytromo

我下载了一个名为ack-grep的程序。当输入ack-grep foo时,它将在所有子目录中搜索foo。更少,颜色消失了。但是,该程序似乎不支持“ --color = always”,无论如何感谢帮助
Mohammad Reza Rezwani 2014年

1
@alex ack有一个--color论点:ack-grep -i select --color | less -R
Oli

@Oli .........我的天啊........唯一的事情,我可以说你的知识和帮助,也功率的Linux
穆罕默德·礼萨·Rezwani

1
@ B1KMusic我同意。我非常同意,以至于发现它的工作原理并更新了答案。您可以使用-C参数强制列。
奥利(Oli)

2

如果您less更一般地对颜色感兴趣,则可能要看一下lesspipe.sh。参见,例如,http://freecode.com/projects/lesspipe

lesspipe.sh是less的手册页中所述的pager less的输入过滤器。该脚本在兼容ksh的外壳程序(例如bash,zsh)下运行,使您可以减少查看二进制内容,压缩文件,归档文件和归档文件中包含的文件的时间。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.