2>&1

在shell中,digit1 >& digit2表示将描述符digit1重定向到描述符digit2的同一文件.

那么:

./a.out > out 2>&1

将标准输出和标准出错输出重定向到out文件

./a.out  2>&1 > out
将标准出错输出重定向到标准输出,标准输出重定向到out文件。

两者功能并不相同。

为什么顺序不一样产生的效果就不一样呢?

实质上shell解释器是在内部调用dup2()类似的函数来实现重定向的.

因为shell从左向右解释命令.

对于 ./a.out > out 2>&1

先调用 dup2(out,STDOUT_FILENO);//out,STDOUT_FILENO指向同一文件表项

然后再是 dup2(STDOUT_FILENO,STDERR_FILENO);//STDERR_FILENO,STDOUT_FILENO指向同一文件表项

而./a.out  2>&1 > out

先是 dup2(STDOUT_FILENO,STDERR_FILENO);//标准出错指向原来的标准输出

再是 dup2(out,STDOUT_FILENO);//标准输出重定向到out文件.

通俗的说,上面的过程类似于有a,b,c三个变量.

a=c,b=a;//a==b==c 和 b=a,a=c;//b!=c==a当然不一样了.

实践:

./a.out \< in 将标准输入重定向到in文件,即程序从in文件中读取数据.

在使用mysql命令行程序时,可以先把SQL语句写入文件中,然后利用重定向输入,避免了不方便的输入.(Windows下cmd也支持)

当在无X环境下查看程序输出时,若输出数据较多,一屏无法显示,此时可以将标准输出重定向到文件中,然后仔细查看.

附测试程序:

#include\<unistd.h>
#include\<stdio.h>
#include\<string.h>
#define BUFFSIZE 4096
int main()
{
int n;
char buf[BUFFSIZE];
const char out[]="STDOUT:";
const char err[]="STDERR:";
n=read(STDIN_FILENO,buf,BUFFSIZE);//read from stdin
if (n>0)
{
write(STDOUT_FILENO,out,strlen(out));
write(STDOUT_FILENO,buf,n);//write to stdout
write(STDERR_FILENO,err,strlen(err));
write(STDERR_FILENO,buf,n);//write to stderr
}
return 0;
}

Comments