我正在为Linux编写命令行实用程序。 如果输出(stdout)转到shell,那么打印一些转义来着色输出会很不错。但是如果输出被重定向,那么bash转义不应该打印,否则内容可能会破坏依赖于该输出的解析器。
有几个程序执行此操作(吮吸为ack
)但我找到的是用Perl编写的,我无法知道他们是如何做到的。
我想用C / C ++来编写我的实用程序。
答案 0 :(得分:12)
您可以在linux上使用isatty。此函数显然不是标准C,因为 - 例如 - 在许多平台上,您无法将输出重定向到文件。
答案 1 :(得分:7)
看一下这段代码:
int is_redirected(){
if (!isatty(fileno(stdout))){
fprintf(stdout, "argv, argc, someone is redirecting me elsewhere...\n");
return 1;
}
return 0;
}
/* ... */
int main(int argc, char **argv){
if (is_redirected()) exit(-1);
/* ... */
}
如果重定向程序,该函数将返回1。请注意main(...)
如何调用它。如果程序要运行并被重定向到stderr
或文件,则程序会立即退出。
答案 2 :(得分:4)
在(非标准)C中,您可以使用isatty()。在perl中,它使用-t运算符完成:
$ perl -E 'say -t STDOUT' 1 $ perl -E 'say -t STDOUT' | cat $
在shell中你可以使用test:
$ test -t 1 && echo is a tty is a tty $ (test -t 1 && echo is a tty ) | cat $