Moh*_*ani 31 command-line less
当我在没有寻呼机的情况下运行程序(例如grep
或ls
)时,其输出是彩色的。但是,当我运行它时,它的输出通过管道传输到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)