要搞清楚数据流重定向,须要先搞清楚什么是数据流,而后如何重定向,这一切都须要从命令的执行过程提及。学习
如上图所示为命令的执行过程,能够看到,在Linux中,数据流分三种:标准输入(stdin)、标准输出(stdout)和标准错误(stderr)。this
执行命令时,这个命令可能经过文件读入数据,处理后再将数据输出到屏幕,譬如:spa
cat /etc/crontab /etc/notexist
cat会由/etc/cronbtab和/etc/notexist读入数据,而后将数据输出到屏幕上,不过,由于不存在/etc/notexist这个文件,因此会显示错误消息,这个消息也打印到屏幕上。code
所谓的数据流重定向,就是将命令执行后应该要出如今屏幕上的数据,传输到其余地方,例如文件或者设备。而要把这些数据传送到别的地方,则须要用到传送命令。blog
咱们知道,要将默认输入到屏幕上的数据流重定向,须要传送命令,主要分为三种:crontab
1. 标准输入(stdin):代码为0,使用<或者<<ci
2. 标准输出(stdout):代码为1,使用>或者>>get
3. 标准错误(stderr):代码为2,使用2>或者2>>input
总结来讲,命令执行中重定向的方式以下:it
命令 |
> 1> >> 2> 2>> < |
设备或文件 |
其中>和1>是同样的,由于标准输出代码是1,能够省略。
例如,将ls –l 根目录的数据重定向到~/rootfile:
ls -l / > ~/rootfile
整个重定向的过程以下:
(1)当文件(本例中的~/rootfile)不存在时,系统自动创建。
(2)若是文件存在,则先把文件的内容清空,而后写入数据。
若是不想清空原来的数据,而是想在原来的基础上累加,则须要使用>>,如:
ls -l / >> ~/rootfile
例如,咱们cat一个不存在的文件:
cat notexistfile 提示:cat: notexistfile: No such file or directory
若是咱们要把这个错误输出,重定向,就能够这样:
cat notexistfile 2> errorfile
除了重定向的是标准错误外,它的重定向过程和>是同样的,固然若是想累加,就用2>>。
组合一下就好了,如:
cat /etc/crontab /etc/notexist > rightfile 2> errorfile
特别的,若是要将数据输入同一个文件,这个时候不能这么写:
cat /etc/crontab /etc/notexist > errorfile 2> errorfile
这条指令并不会提示错误,可是由于有两条数据流同时写入一个文件,会致使交叉写入,形成数据错乱,让文件的信息不可读,这个时候须要用到2>&1,表示将标准错误重定向到标准输出中去:
cat /etc/crontab /etc/notexist > errorfile 2>&1
或者,使用更简洁的符号&>,上面的语句等价于:
cat /etc/crontab /etc/notexist &> errorfile
这个时候就须要用到 /dev/null 这个文件了,它至关于一个黑洞或者说垃圾桶,当重定向到这个文件时,全部信息都会消失不见:
cat /etc/crontab /etc/notexist > /dev/null 2>&1
譬如,咱们使用cat命令在键盘上输入数据,而后写入一个文件:
cat > catfile this a file <== 输完以后经过ctrl+d结束输入
此时就有catfile产生,文件内容就是刚输入的内容,若是想经过其余文件来代替键盘输入,则能够:
cat > catfile2 < catfile
这就是<的用法,而<<的用法有点不同,它表示“结束的输入字符”,例如咱们想用cat将输入的消息输出到catfile中,且当输入EOF时,此次输出结束:
cat > catfile <<EOF > this is a new input > EOF
当输入EOF的时候就会自动结束输入,而没必要使用ctrl+d来结束,注意的是EOF没有写入文件。
1. 屏幕的输出很重要,须要保存到文件中。
2. 后台执行的程序,不但愿它干扰屏幕正常的输出结果。
3. 一些系统的例行性命令如crontab的执行结果,但愿它能保存下来。
4. 一些执行命令,已经知道它可能的错误消息,想经过”2> /dev/null”直接丢掉。
5. 错误消息和正确消息须要分别输出。
《鸟哥的Linux私房菜_基础学习篇》(第二版)
(完)