数据流重导向可以将 standard output (简称 stdout) 与 standard error output (简称 stderr) 分别传送到其他的文件或装置去,而分别传送所用的特殊字符则如下所示:
- 标准输入 (stdin) :代码为 0 ,使用 < 或 << ;
- 标准输出 (stdout):代码为 1 ,使用 > 或 >> ;
- 标准错误输出(stderr):代码为 2 ,使用 2> 或 2>> ;
为了理解 stdout 与 stderr ,我们先来看如下示例:
观察你的系统根目录 (/) 下各目录的文件名、权限与属性,并记录下来
[root@www ~]# ll / <==此时屏幕会显示出文件名信息
[root@www ~]# ll / > ~/rootfile <==屏幕并无任何信息
[root@www ~]# ll ~/rootfile <==有个新档被创建了!
-rw-r--r-- 1 root root 1089 Feb 6 17:00 /root/rootfile
加上重定向 > 后输出的数据就写入 rootfile 中:
- 该文件 (本例中是 ~/rootfile) 若不存在,系统会自动的将他创建起来,但是
- 当这个文件存在的时候,那么系统就会先将这个文件内容清空,然后再将数据写入!
- 也就是若以 > 输出到一个已存在的文件中,那个文件就会被覆盖掉
如果我想要将数据累加而不想要将旧的数据删除,可以使用两个大于符号 >> ,上面的示例改成 ll / >> ~/rootfile 即可。
如果是 standard error output 的错误数据,可以使用 2> 及 2>> ,同样是覆盖 (2>) 与累加 (2>>) 的特性,我们在刚刚才谈到 stdout 代码是 1 而 stderr 代码是 2 , 所以这个 2> 是很容易理解的,而如果仅存在 > 时,则代表默认的代码 1 。
将 stdout 与 stderr 分存到不同的文件去
[dmtsai@www ~]$ find /home -name .bashrc > list_right 2> list_error
将正确与错误数据通通写入同一个文件去
将命令的数据全部写入名为 list 的文件中
[dmtsai@www ~]$ find /home -name .bashrc > list 2> list <==错误
[dmtsai@www ~]$ find /home -name .bashrc > list 2>&1 <==正确
[dmtsai@www ~]$ find /home -name .bashrc &> list <==正确
上述表格第一行错误的原因是,由于两股数据同时写入一个文件,又没有使用特殊的语法, 此时两股数据可能会交叉写入该文件内,造成次序的错乱。所以虽然最终 list 文件还是会产生,但是里面的数据排列就会怪怪的,而不是原本屏幕上的输出排序。