关于数据流重定向

1、什么是数据流重定向

要搞清楚数据流重定向,须要先搞清楚什么是数据流,而后如何重定向,这一切都须要从命令的执行过程提及。学习

基本流程图副本

如上图所示为命令的执行过程,能够看到,在Linux中,数据流分三种:标准输入(stdin)、标准输出(stdout)和标准错误(stderr)this

执行命令时,这个命令可能经过文件读入数据,处理后再将数据输出到屏幕,譬如:spa

cat /etc/crontab /etc/notexist

cat会由/etc/cronbtab和/etc/notexist读入数据,而后将数据输出到屏幕上,不过,由于不存在/etc/notexist这个文件,因此会显示错误消息,这个消息也打印到屏幕上。code

所谓的数据流重定向,就是将命令执行后应该要出如今屏幕上的数据,传输到其余地方,例如文件或者设备。而要把这些数据传送到别的地方,则须要用到传送命令。blog

 

2、传送命令

咱们知道,要将默认输入到屏幕上的数据流重定向,须要传送命令,主要分为三种:crontab

1. 标准输入(stdin):代码为0,使用<或者<<ci

2. 标准输出(stdout):代码为1,使用>或者>>get

3. 标准错误(stderr):代码为2,使用2>或者2>>input

总结来讲,命令执行中重定向的方式以下:it

命令

>

1>

>>

2>

2>>

<

设备或文件

其中>和1>是同样的,由于标准输出代码是1,能够省略。

 

3、具体用法

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没有写入文件。

 

4、使用场景

1. 屏幕的输出很重要,须要保存到文件中。

2. 后台执行的程序,不但愿它干扰屏幕正常的输出结果。

3. 一些系统的例行性命令如crontab的执行结果,但愿它能保存下来。

4. 一些执行命令,已经知道它可能的错误消息,想经过”2> /dev/null”直接丢掉。

5. 错误消息和正确消息须要分别输出。

 

5、参考

《鸟哥的Linux私房菜_基础学习篇》(第二版)

(完)

相关文章
相关标签/搜索