什么是数据流重定向?
一般来说,如果你要执行一个命令,这个命令可能会由文件读入数据,经过处理之后,再将数据输出到屏幕上。
标准输出与标准错误
简单地说,标准输出指的是命令执行所回传的正确的信息,而标准错误输出可以理解为命令执行失败后,所回传的错误信息。这两个命令默认都是输出到屏幕上来,所以屏幕当然是混乱的。那能不能通过某些机制将这两条数据分开呢?当然可以。这就是数据流重定向的功能。
>与>>
1>:以覆盖的方法将正确的数据输出到指定文文件或设备上。
1>>:以累加的方法将正确的数据输出到指定文文件或设备上。
2>:以覆盖的方法将错误的数据输出到指定文文件或设备上。
2>>:以累加的方法将错误的数据输出到指定文文件或设备上。
注意:“1>>”以及“2>>”之间是没有空格的。
示例:将stdout和stderr分别存到不同的文件中去。
find /home -name .bashrc >list_right 2>list_error
命令执行完毕,正确的打印信息就会输出到List_right这个文件,而错误的打印信息就会输出到list_error这个文件中去了。
注意:如果list_right不存在,系统会自动创建。
/dev/null垃圾桶黑洞设备与特殊写法
想象一下,如果唔知道错误信息会发生,所以想要直接将错误信息丢弃掉呢?这个时候黑洞设备/dev/null就很重要了。它可以吃掉任何导向这个设备的信息。
示例:将上述的例子修正一下。将错误的数据丢弃,屏幕上只显示正确的数据。
find /home -name .bashrc 2> /dev/null
再想象一下,如果我要将正确的和错误的信息都写入到一个文件中去呢?这时候就要采用特殊的写法了。
示例:将命令的数据全部写入名为list的文件中
find /home -name ./bashrc >list 2> list //错误
find /home -name ./bashrc >list 2>&1 //正确
find /home -name ./bashrc &>list //正确
第一行错误的原因是:由于两条数据写入同一个文件,又没有使用特殊的语法,所以可能就会造成数据交叉写入,造成次序的混乱。一般比较习惯于第二种写法。
<与<<
简单的说法,就是将原本需要由键盘输入的数据改由文件内容而替代。
由于加入>在cat后,所以catfile会被主动创建,而内容就是键盘上输入这这些字母了。
那能不能用纯文本文件代替键盘的输入呢?
执行完上述命令,我们发现这两个文件大小几乎一模一样,几乎像是使用cp复制的一般。
理解<之后,我们再来看一下<<的使用
举例来讲,我们要用cat直接将输入的信息输入到catfile文件中去,并且在遇到“eof”的时候,表示输入结束。
我们发现,最后输入的eof并没有输入到catfile文件中去,它只是代表着本次输入的结束。