当前位置: 首页>>技术教程>>正文


我如何让 `less` 输出颜色?

,

问题描述

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

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

grep -r something

但这不行:

grep -r something | less

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

最佳思路

这里有两个问题:

  • 诸如 ls “which auto-detect the colour support” 之类的命令无法从管道中找到支持

  • less 默认设置为仅显示颜色代码。

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

ls --color=always | less -R

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


更像 in-depth 的答案是 ls 正在检查其 STDOUT 是否属于真实终端。当您通过管道传输内容时,STDOUT 将被设置为下一个命令的 STDIN。

您可以在 ls 源代码中看到这一点。它使用 isatty 命令(核心 POSIX 接口)来找出情况:

  • 是否默认开启颜色:

    \n

        print_with_color = (i == color_always\n                        || (i == color_if_tty\n                            && isatty (STDOUT_FILENO)));\n
  • 我们是否尝试以多列输出:

    \n

    if (format == long_format)\n  format = (isatty (STDOUT_FILENO) ? many_per_line : one_per_line);\n\n//...\n\nif (isatty (STDOUT_FILENO))\n  {\n    format = many_per_line;\n    set_quoting_style (NULL, shell_escape_quoting_style);\n    qmark_funny_chars = true;\n  }\nelse\n  {\n    format = one_per_line;\n    qmark_funny_chars = false;\n  }\n

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

color_option = isatty (STDOUT_FILENO) && should_colorize ();

次佳思路

如果您对 less 中的颜色更感兴趣,您可能需要查看 lesspipe.sh 。例如,请参阅 https://github.com/wofr06/lesspipe

\\n

lesspipe.sh is an input filter for the pager less as described in less’s man page. The script runs under a ksh-compatible shell (e.g. bash, zsh) and allows you to use less to view files with binary content, compressed files, archives, and files contained in archives.

\\n

它还将像文本编辑器一样为 shell 脚本、perl 脚本等着色,但无需使用任何 “preprocessing” 程序来进行着色。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/14591.html,未经允许,请勿转载。