通过管道处理 ANSI 彩色文本时,less -R 不显示颜色

通过管道处理 ANSI 彩色文本时,less -R 不显示颜色

该命令terraform show不显示彩色文本,但命令terraform show | less显示的输出似乎是文本颜色代码

ESC[0m#module.vpc.module.label.data.null_data_source.tags_as_list_of_maps[2]: data "null_data_source" "tags_as_list_of_maps" {
ESC[1mESC[0mhas_computed_defaultESC[0mESC[0m = "default"
ESC[1mESC[0midESC[0mESC[0m                   = "static"
ESC[1mESC[0minputsESC[0mESC[0m               = {
    "key"   = "IaC"
    "value" = "Terraform"

的输出terraform show | less -R只是白色,就像在terraform show没有管道的情况下运行时一样:

# module.subnets.module.public_label.data.null_data_source.tags_as_list_of_maps[0]:
data "null_data_source" "tags_as_list_of_maps" {
    has_computed_default = "default"
    id                   = "static"
    inputs               = {
        "key"   = "Attributes"
        "value" = "k8s-cluster"

知道为什么less或者可能是终端无法解释这些颜色代码吗?

答案1

您发布的代码片段仅使用两个代码:

  • ESC[0m– 重置/正常
  • ESC[1m– 大胆或增加强度

来源

但无论后者出现在哪里,前者都会紧随其后,如下所示:ESC[1mESC[0m。此外,ESC[0m开头有一个显式。实际上,所有可打印片段都受 控制ESC[0m,因此整个片段显示为“正常”。


要了解代码如何工作:

sed "$(printf 's/ESC/\033/g')" <<EOF
ESC[0mNormal ESC[1mBold ESC[0m Normal
EOF

要使用已发布的代码片段复制结果:

sed "$(printf 's/ESC/\033/g')" <<EOF
ESC[0m#module.vpc.module.label.data.null_data_source.tags_as_list_of_maps[2]: data "null_data_source" "tags_as_list_of_maps" {
ESC[1mESC[0mhas_computed_defaultESC[0mESC[0m = "default"
ESC[1mESC[0midESC[0mESC[0m                   = "static"
ESC[1mESC[0minputsESC[0mESC[0m               = {
    "key"   = "IaC"

"value" = "Terraform"
EOF

还有一个版本X在每个之前注入,因此您可以看到如果没有立即取消ESC代码将如何工作:ESC[0mESC[1m

sed "$(printf 's/ESC/X\033/g')" <<EOF
ESC[0m#module.vpc.module.label.data.null_data_source.tags_as_list_of_maps[2]: data "null_data_source" "tags_as_list_of_maps" {
ESC[1mESC[0mhas_computed_defaultESC[0mESC[0m = "default"
ESC[1mESC[0midESC[0mESC[0m                   = "static"
ESC[1mESC[0minputsESC[0mESC[0m               = {
    "key"   = "IaC"

"value" = "Terraform"
EOF

答案2

添加到Kamil Maciorowski 的回答维基百科说(你似乎已经知道)CSI…… 序列是“选择图形再现”序列——它们影响外貌文本。但颜色代码都是两位数(一些非标准代码是三位数)。代码 1 表示粗体或强度增加。因此,即使 和 之间有文本ESC[1m, ESC[0它仍然是白色的,只是更粗/更亮。

相关内容