【发布时间】:2017-01-09 13:35:38
【问题描述】:
除了isatty,还有其他方法可以知道cout 是否输出到正确接受颜色的终端?
我正在使用this header 作为颜色,并且我已经在使用if(isatty(1)) 来了解输出是否为goes to a terminal。
不幸的是,当我将颜色输出到 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 的输出:
【问题讨论】:
-
isatty仅将输出标识为某种终端;终端不一定是彩色的。在 XCode 中运行时,$TERM为 null,但更可靠的解决方案可能是使用ncurses。 -
@molbdnilo 谢谢。这是一个好的开始:也许我可以使用 getenv 获取 $TERM,然后检查是否为 null - 如果是,我在 Xcode 的控制台(或我猜的任何其他哑终端)中。我会试试的。
-
我做了
getenv("TERM"),在 XCode 中得到了 null,在 iTerm 和 Terminal 中配置了。 -
@molbdnilo 是的,这行得通,它回答了我的问题。如果您想发布答案,我会很乐意接受。一个简单的 if/else 检查 getenv("TERM") 是否为空告诉我我是否在一个哑终端中,这是完美的。