确定是否在C/C+中重定向流程输出+;
我正在为Linux编写命令行实用程序。 如果输出(stdout)是一个shell,那么最好打印一些转义以对输出着色。但是如果输出被重定向,这些bash转义就不应该被打印出来,否则内容可能会破坏依赖于该输出的解析器 有几个程序可以做到这一点(比如确定是否在C/C+中重定向流程输出+;,c,shell,stdout,C,Shell,Stdout,我正在为Linux编写命令行实用程序。 如果输出(stdout)是一个shell,那么最好打印一些转义以对输出着色。但是如果输出被重定向,这些bash转义就不应该被打印出来,否则内容可能会破坏依赖于该输出的解析器 有几个程序可以做到这一点(比如ack),但我发现的那些程序是用Perl编写的,我不知道它们是如何做到的 我想用C/C++编写我的实用程序。可以在linux上使用。此函数显然不是标准C,因为(例如)在许多平台上无法将输出重定向到文件。在(非标准)C中,可以使用isatty()。在perl
ack
),但我发现的那些程序是用Perl编写的,我不知道它们是如何做到的
我想用C/C++编写我的实用程序。可以在linux上使用。此函数显然不是标准C,因为(例如)在许多平台上无法将输出重定向到文件。在(非标准)C中,可以使用isatty()。在perl中,它是通过-t运算符完成的:
$ perl -E 'say -t STDOUT'
1
$ perl -E 'say -t STDOUT' | cat
$
$perl-E'say-t STDOUT'
1.
$perl-E'say-t STDOUT'| cat
$
在shell中,您可以使用测试:
$ test -t 1 && echo is a tty
is a tty
$ (test -t 1 && echo is a tty ) | cat
$
$test-t1&&echo是一个tty
这是一个有趣的故事
$(测试-T1&&echo是tty)| cat
$
请查看以下代码:
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或某个文件,程序将立即退出。isatty()
不是标准C,但它是POSIX,因此它将在所有类似Unix的平台上可用。ISO版本也可在Windows上使用。非常整洁。可能最好使用isatty(STDOUT\u FILENO)
而不是使用FILENO()