确保程序在终端中运行

4
我试图使用ansi转义码为在终端中显示的一些字符串添加颜色。到目前为止,我还没有完全掌握ascii转义码的所有内容,只是尝试通过复制粘贴一些转义码来尝试。然后看到了这个答案,它要求验证程序是否应该检查它是否在终端中执行,否则就继续而不会用转义码污染字符串?
答案解释了使用*nix基于函数isatty(),我发现它位于unistd.h中,但根据我的理解,它没有在c标准中首先被提升到cunistd。我尝试再次搜索SO,但无法理解。现在我有两个关于此的问题:
  • 在什么环境(正确的词?)下,一个使用ascii转义码的程序可以执行需要进行初始检查?因为我只构建cli。
  • 根据ISO cpp标准,处理此问题的适当解决方案是什么?使用unistd.h?这将符合现代cpp实践吗?
另外,在处理ansi /颜色相关事物之前,我需要阅读/理解什么?

unistd.h是一个POSIX头文件,它完全与C和C++标准无关。我认为这两个标准都没有终端的概念,因此您只能依赖系统API来获取特定于系统的功能。 - melak47
相关链接:https://dev59.com/82Up5IYBdhLWcg3wXGkZ。 - David Hammen
1个回答

5
在类Unix系统(例如Linux或OSX)上,isatty函数是正确的函数,用于确定您是否正在将输出发送到终端。

使用方法如下:

if (isatty(STDOUT_FILENO))
{
    // Output using VT100 control codes
}
else
{
    // Output is not a TTY, could be a pipe or redirected to a file
    // Use normal output without control codes
}

管道和重定向 == bash 的 |>?VT100 是什么?我的知识仅限于 tty、pty、shell 和 gui 终端 :( - Abhinav Gauniyal
2
你应该使用termcap库来获取转义序列,而不是为特定终端硬编码序列。但是所有现代终端仿真器都使用基于70年代的VT100终端的序列。 - Barmar
@AbhinavGauniyal 维基百科是你的好朋友 :) - Some programmer dude
@Barmar 我目前正在学习terminfo,我猜我应该使用它而不是termcap,对吧?用户报告称terminfo在OSX上也可以工作。 - Abhinav Gauniyal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接