【问题标题】:Shell script to identify colored console output用于识别彩色控制台输出的 Shell 脚本
【发布时间】:2014-12-07 14:22:12
【问题描述】:

我需要确定我的终端是否使用 bash 脚本打印彩色输出。有没有直接的shell命令来做到这一点?我怎样才能做到这一点?

我的主要目标是确定输出是否与终端的默认字体颜色匹配。如果不匹配,我应该在文本文件中写一条警告消息。

【问题讨论】:

  • 我不太确定您在问什么,但可能会在这里回答:"How do I determine if a terminal is color-capable?"
  • 恕我直言,而不是确定输出是否与终端的默认字体颜色匹配会更好地将输出的颜色更改为想要的颜色...
  • 没有。这是为了测试目的。我想确认我的颜色变化是否受到影响。

标签: bash shell


【解决方案1】:

控制字符也是输出字符,因此您可以检测到它们的序列类似于this answer

if printf "\x1b[31mRed\x1b[0m" | grep -Pq "\\x1b\[[0-9;]+m"; then
  echo colored
else
  echo uncolored
fi
  • printf 支持输出控制序列。如果您使用echo,则需要-e
  • grep -q 将禁止打印,如果找到匹配项,则退出 0(成功),如果没有,则退出非零(失败)。
  • 您需要在 grep 上使用 -P(PERL 正则表达式)才能解释控制序列,因为 POSIX 正则表达式不支持转义字符。请注意\\x1b 中的双反斜杠,这意味着您让grep 处理转义而不是您的shell。 GNU grep 支持 Perl 正则表达式,但 BSD(包括 Mac OS X)似乎不支持。

某些脚本仅在检测到输入类似于 tty 时才使用控制字符,因此您可能希望使用 script command 将包含控制字符的输出直接捕获到文件中。

【讨论】:

  • 应该是 if printf "\x1b[31mRed\x1b[0m" | grep -pq "\\x1b[[0-9]m";然后 echo coloured else echo uncolored fi
【解决方案2】:

我这样做的方法是搜索 Escape Sequence,已关注 通过color code,示例

# red
awk '/\033\[31m/'

Example

【讨论】:

    猜你喜欢
    • 2013-05-26
    • 2020-07-13
    • 1970-01-01
    • 2016-09-15
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 2020-06-03
    相关资源
    最近更新 更多