关于数据流重定向
Posted 大师兄的博客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于数据流重定向相关的知识,希望对你有一定的参考价值。
一、什么是数据流重定向
要搞清楚数据流重定向,需要先搞清楚什么是数据流,然后如何重定向,这一切都需要从命令的执行过程说起。
如上图所示为命令的执行过程,可以看到,在Linux中,数据流分三种:标准输入(stdin)、标准输出(stdout)和标准错误(stderr)。
执行命令时,这个命令可能通过文件读入数据,处理后再将数据输出到屏幕,譬如:
cat /etc/crontab /etc/notexist
cat会由/etc/cronbtab和/etc/notexist读入数据,然后将数据输出到屏幕上,不过,因为不存在/etc/notexist这个文件,所以会显示错误消息,这个消息也打印到屏幕上。
所谓的数据流重定向,就是将命令执行后应该要出现在屏幕上的数据,传输到其他地方,例如文件或者设备。而要把这些数据传送到别的地方,则需要用到传送命令。
二、传送命令
我们知道,要将默认输入到屏幕上的数据流重定向,需要传送命令,主要分为三种:
1. 标准输入(stdin):代码为0,使用<或者<<
2. 标准输出(stdout):代码为1,使用>或者>>
3. 标准错误(stderr):代码为2,使用2>或者2>>
总结来说,命令执行中重定向的方式如下:
命令 |
> 1> >> 2> 2>> < |
设备或文件 |
其中>和1>是一样的,因为标准输出代码是1,可以省略。
三、具体用法
1. 标准输出重定向
例如,将ls –l 根目录的数据重定向到~/rootfile:
ls -l / > ~/rootfile
整个重定向的过程如下:
(1)当文件(本例中的~/rootfile)不存在时,系统自动建立。
(2)如果文件存在,则先把文件的内容清空,然后写入数据。
如果不想清空原来的数据,而是想在原来的基础上累加,则需要使用>>,如:
ls -l / >> ~/rootfile
2. 标准错误重定向
例如,我们cat一个不存在的文件:
cat notexistfile 提示:cat: notexistfile: No such file or directory
如果我们要把这个错误输出,重定向,就可以这样:
cat notexistfile 2> errorfile
除了重定向的是标准错误外,它的重定向过程和>是一样的,当然如果想累加,就用2>>。
3. 同时标准输入、输出重定向
组合一下就行了,如:
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
4. 丢弃标准输入/错误的结果
这个时候就需要用到 /dev/null 这个文件了,它相当于一个黑洞或者说垃圾桶,当重定向到这个文件时,所有信息都会消失不见:
cat /etc/crontab /etc/notexist > /dev/null 2>&1
5. 标准输入重定向
譬如,我们使用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私房菜_基础学习篇》(第二版)
(完)
以上是关于关于数据流重定向的主要内容,如果未能解决你的问题,请参考以下文章