【发布时间】:2011-01-02 21:42:56
【问题描述】:
我正在为 Linux 编写命令行实用程序。 如果输出(stdout)将发送到 shell,最好打印一些转义符来为输出着色。但是,如果输出被重定向,则不应打印那些 bash 转义,否则内容可能会破坏依赖该输出的解析器。
有几个程序可以做到这一点(就像ack),但我发现的那些是用 Perl 编写的,我不知道他们是如何做到的。
我想使用 C/C++ 来编写我的实用程序。
【问题讨论】:
我正在为 Linux 编写命令行实用程序。 如果输出(stdout)将发送到 shell,最好打印一些转义符来为输出着色。但是,如果输出被重定向,则不应打印那些 bash 转义,否则内容可能会破坏依赖该输出的解析器。
有几个程序可以做到这一点(就像ack),但我发现的那些是用 Perl 编写的,我不知道他们是如何做到的。
我想使用 C/C++ 来编写我的实用程序。
【问题讨论】:
您可以在 Linux 上使用isatty。这个函数显然不是标准的 C,因为 - 例如 - 在许多平台上你不能将输出重定向到一个文件。
【讨论】:
isatty() 不是标准 C,但它是 POSIX,因此它将在所有类 Unix 平台上可用。
看看这段代码:
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(STDOUT_FILENO) 可能比使用fileno() 更好
在(非标准)C 中,您可以使用 isatty()。在 perl 中,它是使用 -t 运算符完成的:
$ perl -E '说 -t STDOUT' 1 $ perl -E '说 -t STDOUT' |猫 $在shell中你可以使用test:
$ test -t 1 && echo 是一个 tty 是一个 tty $ (test -t 1 && echo 是一个 tty ) |猫 $【讨论】: