与Unix文化一脉相承的Linux,继承了系统中一切都是文件,一切都是字符流的思想。而字符流的流向,在程序(或者说命令,基本是一回事儿)执行的,可以进行重定向。
既然是“重”定向,那就有原来的默认的方向:
每个 Unix/Linux 程序(命令)运行时都会默认打开三个文件描述符(file descriptor,FD):
标准输入文件(stdin):stdin的文件描述符为0,程序默认从stdin读取数据。
标准输出文件(stdout):stdout 的文件描述符为1,程序默认向stdout输出数据。
标准错误文件(stderr):stderr的文件描述符为2,程序会向stderr流中写入错误信息。(stderr没有缓存,Intel出过笔试题)
进程的3个“标准流”
默认情况下,我们在shell上执行命令,stdin就是键盘,stdout就是显示器,stderr也是显示器。
重定向,就是用过>,>这样的符号进行的。
$command > file
将 stdout 重定向到 file,注意不包括重定向stderr。
$command < file
将stdin 重定向到 file,就是将file的内容作为命令的输入。
$command 2 > file
将stderr的内容重定向到file,注意不包括重定向stdout。
$command > file 2>&1
将stdout重定向到file,同时将stderr重定向到stdout,这样的效果就是,stdout和stderr都重定向到了file。
$command 2>/dev/null
将错误信息输出到/dev/null设备。
在Linux系统中,设备的读写跟文件读写一样,写入
$command < pfile > ofile
将pfile作为命令的输入,将命令的stdout重定向到ofile,注意没有重定向stderr。
>>表示对重定向的文件进行追加写入。
注意这里没有介绍<