检测`cout`是否输出到支持彩色的终端?

6

除了使用isatty,还有其他方法可以知道cout是否输出到支持颜色的终端吗?

我正在使用这个头文件来实现颜色输出,已经使用if(isatty(1))来判断输出是否进入终端

不幸的是,当我将颜色输出到Xcode的控制台时,会出现未转义的序列——但是在OS X中从Terminal.app或iTerm执行应用程序本身时,它可以正常工作。

我想Xcode的控制台虽然识别自己是一个终端,但仍然忽略颜色序列...

因此,如果可能的话,我想要更好的检测方法。

我的代码很简单,类似于这样,如果isatty为真,则返回带颜色的字符串,然后输出到cout

std::string Slot::description()
{
    if(isatty(1))
    {
        return FBLU("my_string");
    }
    else
    {
        return "my_string";
    }
}

Xcode的输出:

在此输入图片描述

iTerm的输出:

在此输入图片描述


2
isatty 只能识别输出是否为某种终端;终端不一定是彩色的。当您在 XCode 中运行时,$TERM 为空,但更可靠的解决方案可能是使用 ncurses - molbdnilo
@molbdnilo 谢谢。这是一个不错的开始:也许我可以使用getenv获取$TERM,然后检查是否为空 - 如果是,那么我就在Xcode的控制台中(或者其他任何愚蠢的终端)。我会尝试一下。 - Eric Aya
我在XCode中运行了 getenv("TERM") 但却得到了空值,在iTerm和Terminal中则正常配置。 - molbdnilo
1
没错,这个方法可行,而且解答了我的问题。如果你想回答的话,我会很高兴接受。一个简单的if/else语句检查getenv("TERM")是否为空就可以告诉我是否在一个低级终端中,非常完美。 - Eric Aya
1个回答

3

具体来说,在 XCode 中,您可以检查 getenv("TERM"),因为在 XCode 中该函数将返回 null,并且如果您在“真实”终端中运行,则不应该出现这种情况。

要更可靠地确定您是否拥有彩色终端,ncurses 可能是一个好选择。


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