在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