关于数据流重定向

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私房菜_基础学习篇》(第二版)

(完)

以上是关于关于数据流重定向的主要内容,如果未能解决你的问题,请参考以下文章

重定向时如何在 Safari 中保留 uri 片段?

Jsp获取Java的重定向赋值(String)

302 登录重定向后被 IE 删除的 URL 片段

链接中的 URL 片段和 JSF 中的 ajax 重定向

使用片段 (#) 重定向链接 - asp.net

Linkedin OAuth 2.0 重定向 URL 不能包含片段标识符 (#)