【问题标题】:How to judge whether stdout supports ANSI escape code如何判断stdout是否支持ANSI转义码
【发布时间】:2021-09-18 12:56:51
【问题描述】:

在不支持ANSI转义码的终端中,输出像\033[0m这样的颜色控制码不仅没有效果,还会干扰终端。

我知道一个json格式化工具叫jq,它判断终端是否可以使用ANSI转义码。

我想知道,如何通过C编程语言来实现这个功能?

【问题讨论】:

  • 您的意思是 ANSI 颜色代码吗? ASCII 未指定任何内容。
  • 在 UNIX 和 Linux 上,环境变量 $TERM 告诉您终端类型,您可以从中推断出支持哪些功能,可能使用 termcap 或 curses。
  • 我记错了,不是ASCII颜色是ANSI转义码标准颜色代码。

标签: c jq stdout ansi


【解决方案1】:

在 Linux 和可能的 POSIX 系统上,您可以使用 isatty(3)STDOUT_FILENO。另见stdio(3)fileno(3)

所以你的代码是

if (isatty(STDOUT_FILENO)) {
   // standard output is a tty
   ...
}

你必须打赌,2021 年大多数终端仿真器都支持ANSI TTY escapes

顺便说一句,jq 是一个open source 软件工具。您可以下载并研究其源代码。

请注意,C 编程语言标准(阅读 n1570 或更高版本)不了解 ttys。阅读TTY demystified 网页。

【讨论】:

  • 谢谢。虽然jq确实是开源的,但是我觉得这个功能并不复杂。在stackoverflow上直接问技术强的人会更快。没错,支持ANSI的终端确实很多。但是,一些流行的工具不提供 ANSI 支持。例如,Logstash 是一个服务器日志收集工具,通过 stdout 收集日志。在其网络上看到像 \033[0m 这样的代码非常不舒服。
  • 我强烈反对。通过浏览现有的开源代码并可能根据您的需要对其进行改进,您总能学到更多东西
  • @aszswaz 所以你是在要求我们的时间,而不是投资你自己的时间。嗯,你想想,是这样吗?
  • 不知道这个结论是从哪里得出的。我没有使用他们必须回答我的问题的任何力量。我自愿提出问题。如果有人愿意提供答案,那是最好的。我非常感谢他们帮助我。没有人愿意提供答案,所以我暂时搁置这个功能,等有时间去查jq源码。
猜你喜欢
  • 2017-02-03
  • 2023-03-10
  • 2011-11-18
  • 2018-11-30
  • 2015-06-23
  • 2016-12-05
  • 1970-01-01
  • 1970-01-01
  • 2013-04-04
相关资源
最近更新 更多