在linux中,我怎样才能testing一个程序的输出是去一个活的terminal或一个文件?

当你使用git的时候,似乎神奇地知道标准输出是通过pipe道还是通过文件传送到控制台。 例如,如果你有颜色启用,你就可以

git status 

它会着色不同类别文件的输出。 但是,如果你这样做

 git status | less 

要么

 git status > status.txt 

它删除了linux的颜色格式 ,你只能看到简单的,无色的文本。

git如何检测其命令的输出是否要去vsterminal

Solutions Collecting From Web of "在linux中,我怎样才能testing一个程序的输出是去一个活的terminal或一个文件?"

isatty(int fd)将检查fd是否指向终端或其他东西。 它是GNU C库中的unistd.h的一部分。

手册页: http : //linux.die.net/man/3/isatty

顺便说一句:如果你想用程序读一个程序,但是你想愚蠢地认为你的程序是一个人,那么有一种方法可以做到这一点。 你可以使用伪终端 (pty)。 例如, 期望使用该技术。

这是一个演示如何检测标准输出是否被重定向的C代码:

 int main(int argc,char ** argv){
     if(!isatty(fileno(stdout))){
       fprintf(stdout,“argv,argc,别人正在将我重定向到其他地方... \ n”);
      返回1;
     }
     / *其余的C代码在这里... * /
 }

这就是git知道输出是去终端还是去文件。

可以确认这是git依赖的:

 $ grep -ir "isatty" ./* ./builtin-commit.c: if (isatty(0)) ./builtin-config.c: stdout_is_tty = isatty(1); ./builtin-pack-objects.c: progress = isatty(2); ./builtin-prune-packed.c: int opts = isatty(2) ? VERBOSE : 0; ./builtin-revert.c: if (isatty(0)) ./builtin-shortlog.c: if (!nongit && !rev.pending.nr && isatty(0)) ./builtin-unpack-objects.c: quiet = !isatty(2); ./color.c: stdout_is_tty = isatty(1); ./compat/winansi.c: if (!isatty(fileno(stream))) ./compat/winansi.c: if (!isatty(fileno(stream))) ./pack-redundant.c: if (!isatty(0)) { ./pager.c: if (!isatty(1)) ./pager.c: if (isatty(2)) ./remote-curl.c: options.progress = !!isatty(2); ./transport.c: args.no_progress = args.quiet || (!transport->progress && !isatty(1)); ./transport-helper.c: int no_progress = v < 0 || (!t->progress && !isatty(1)); ./wt-status.c: * will have checked isatty on stdout). 

针对git源代码树运行。

请注意,默认情况下,fds 0 = stdin,1 = stdout,2 = stderr,但这些当然可以重定向或关闭(通常如果您是守护程序,则关闭文件描述符并重新打开所需的)。

从shell脚本中,使用应用于文件描述符0(标准输入)的-t测试标志。

例子:

 # Any Bourne-style shell [ -t 0 ] && echo This is a terminal # Modern interactive shells: ksh, bash, zsh [[ -t 0 ]] && echo This is a terminal