分类: LINUX
2015-07-17 15:23:16
(1)为什么要使用输出重定向
屏幕输出的信息很重要,并且我们需要将它存下来的时候;
后台执行中的程序,不希望它干扰屏幕正常的输出结果时;(这个如何实现)
一些系统的例行命令(例如写在/etc/crontab中的文件)的执行结果,希望他可以存下来时;
一些执行命令的可能已知错误时,想以"2> /dev/null"将它丢掉时;
错误信息与正确信息需要分别输出时
(2)概念
数据流重定向(redirect)就是将某个命令执行后应该要出现在屏幕上的数据传输到其他的地方
我们执行一个命令时,这个命令可能会由文件读入数据,经过处理之后,再将数据输出到屏幕上;
(3)标准输出
标准输出(standard out简称stdout):命令执行所有回传的正确信息
标准错误输出(standard error简称stderr):命令执行失败后,所回传的错误信息。
数据流重定向可以将standard out(简称stdout)与standard error output(简称stderr)分别传送到其他的文件或设备去,而分别传送所用的特殊字符如下:
1、标准输入(stdin):代码为0;使用<或<<;
2、标准输出(stdout):代码为1;使用>或>>;
3、标准错误输出(stderr):代码为2;使用2>或2>>;
1>:以覆盖的方法将正确的数据输出到指定的文件或设备上
1>>:以追加的方法将正确的数据输出到指定的文件或设备上
2>:以覆盖的方式将错误的数据输出到指定的文件或设备上
2>>:以追加的方式将错误的数据输出到指定的文件或设备上
&>:将标准输出stdout(正确)与标准错误输出stderr数据写入同一个文件(覆盖)
2>&1:将标准输出stdout(正确)与标准错误输出stderr数据写入同一个文件(覆盖)
"2>&1"的意思,就是将stderr重定向至stdout,并一起在屏幕上显示出来。如果不加数字,那么默认的重定向动作是针对 stdout(1)的,比如"ls -l > result"就等价于"ls -l 1 > result"。这样便于我们更普遍性的理解重定向过程,
(4)实例:
ll / > ~/rootfile #该文件(本例中是~/rootfile)若不存在,系统会创建,当这个文件存在时,那么系统就会将这个文件内容先清空,然后在将数据写入 ll / >> ~/rootfile #数据会在该文件的最下方累加进去 在默认情况下,>和>>分别表示1>和1>>,所以在命令中没有用到1>和1>>,因为它们是等价的 [awake@awake ~]$ find /home -name .bashrc #使用find查找.bashrc文件由于权限的问题,只能查找到自己家目录的.bashrc文件,其他无权限 /home/awake/.bashrc #标准输出 find: `/home/lost+found': Permission denied #标准错误输出 [awake@awake ~]$ find /home -name .bashrc > list_right 2> list_error #将标准输出和标准错误输出到分别的文件中 [awake@awake ~]$ more list_error find: `/home/lost+found': Permission denied [awake@awake ~]$ more list_right /home/awake/.bashrc [awake@awake ~]$ find /home -name .bashrc 2> /dev/null #将错误的数据丢弃,屏幕上显示正确的数据 /home/awake/.bashrc [awake@awake ~]$ [awake@awake ~]$ find /home -name .bashrc &> list #将正确与错误数据写入同一个文件 [awake@awake ~]$ more list find: `/home/li': Permission denied /home/awake/.bashrc find: `/home/lost+found': Permission denied [awake@awake ~]$ find /home -name .bashrc > list1 2>&1 #将正确与错误数据写入同一个文件 [awake@awake ~]$ more list1 find: `/home/li': Permission denied /home/awake/.bashrc find: `/home/lost+found': Permission denied 注意上面的&>和2>&1虽然的到的结果相同,但使用的语法是不同的, [awake@awake ~]$ find /home -name .bashrc &> list #将正确与错误数据写入同一个文件 [awake@awake ~]$ find /home -name .bashrc > list1 2>&1 #将正确与错误数据写入同一个文件
你不能将语法写成find /home -name .bashrc 2>&1 list1但你可以写成find /home -name .bashrc 2>&1 > list1 |
(5)标准输入:<与<<
<的定义:原本要由键盘输入的数据改由文件内容来替代(有点像脚本啊哈哈哈),用纯文本文件代替键盘的输入,也就是说,用某个文件的内容来替代键盘的敲击。
实例1 [awake@awake ~]$ cat > catfile #用cat创建一个文件 hello hello 这里按下ctrl+D来离开 [awake@awake ~]$ more catfile #查看文件内容 hello hello [awake@awake ~]$ cat > catfile < ~/.bashrc #用纯文本文件,家目录下的.bashrc文件代替键盘的敲击,输入到文件catfile文件(但是不明白cat >在这个语句中的作用) [awake@awake ~]$ ll catfile ~/.bashrc #查看两个文件大小一模一样(内容也是一模一样的),几乎像是要cp复制的一般。 -rw-rw-r--. 1 awake awake 124 May 22 14:15 catfile -rw-r--r--. 1 awake awake 124 Aug 29 2012 /home/awake/.bashrc [awake@awake ~]$ more catfile .bashrc …… 上面的例子就是<标准输入命令的意思 实例2 如果想用另一个文件中的内容输入到dir.txt,可以这样 cat > dir.txt <report/build.xml (不保留文件里原有的内容)或者 cat >> dir.txt <report/build.xml (保留文件里原有的内容) cpio –iduv < /dev/st0(使用cpio还原数据) |
<<的定义:这两个连续的小于号,代表结束输入的意思,值得注意的是,在标准输入重定向中<<并不表示追加,而是表示结束输入。
实例3
[awake@awake ~]$ cat > catfile << "eof" #我要用cat直接输入的信息输出到catfile中,且当键盘输入eof时,该次输入就结束 > this is a test > OK now stop > eof //相当于ctrl+d [awake@awake ~]$ more catfile this is a test OK now stop [awake@awake ~]$ |