(010) Linux之I/O重定向

十年运维系列之基础篇 - Linux

作者:曾林 

联系:1494445739@qq.com

网站:www.jplatformx.com

版权:文章未经同意请勿转载


一、引言

      这里我们来讨论Linux中命令行一个很酷的功能,那就是I/O重定向。I/O是输入/输出的缩写。这个功能可以把命令行的输入重定向为从文件中获取内容,也可以把命令行的输出结果重定向到文件中。如果我们将多个命令行关联起来,将形成非常强大的功能——管道。

 

二、标准输入、标准输出和标准错误

      到目前为止,我们使用过的很多程序生成了不同种类的输出。这些输出通常包含两种类型。一种是程序运行的结果,即该程序生成的数据;另一种是状态和错误信息,表示程序当前的运行情况。比如输入ls这样的命令,屏幕上将显示它的运行结果或者是它的相关错误信息。

      与UNIX“一切都是文件”的思想一致,类似ls的程序实际上把它们的运行结果发送到了一个称为标准输出(standard output,通常表示为stdout)的特殊文件中,它们的状态信息则发送到了另一个称为标准错误(standard error,表示为stderr)的文件中。默认情况下,标准输出和标准错误都将被链接到屏幕上,并且不会被保存在磁盘文件中。

      I/O重定向功能可以改变输出内容发送的目的地,也可以改变输入内容的来源地。通常来说,输出内容显示在屏幕上,输入内容来自于键盘。但是使用I/O重定向功能可以改变这一惯例。

 

三、标准输出重定向

      I/O重定向功能可以重新定义标准输出内容发送到哪里。使用重定向操作符“>",后面接文件名,就可以把标准输出重定向到另一个文件中,而不是显示在屏幕上。比如使用命令“ls -l /usr/bin > ls-output.txt”,将原本输出到屏幕上的内容重定向到了文件ls-output.txt中。但是需要注意的是使用重定向操作符">"会重新改写文件的内容,比如上面的命令如果执行第二遍的话,首先会将ls-output.txt原始内容删除,然后再进行第二次输出。事实上,如果我们需要删除一个文件内容(或者创建一个新的空文件),可以采用这样的方式。例如:"> ls-output.txt"命令仅仅使用了重定向符,并在它之前不加任何命令,就可以删除一个已存在的文件内容或者创建一个新的空文件。

      那么,我们如何能够不从文件的首位置开始覆盖文件,而是从文件的尾部开始添加输出内容呢?可以使用重定向符“>>”来实现。比如:

      ls -l /usr/bin >> ls-output.txt

 

四、标准错误重定向

      标准错误的重定向并不能简单地使用一个专用的重定向符来实现。要实现标准错误的重定向,不得不提到它的文件描述符(file descriptor)。一个程序可以把生成的输出内容发送到任意文件流。如果把这些文件流中的前三个分别对应标准输入文件、标准输出文件和标准错误文件,那么shell将在内部用文件描述符分别索引它们为0、1和2。shell提供了使用文件描述符编号来重定向文件的表示法。由于标准错误等同于文件描述符2,所以可用这种表示法来重定向标准错误。

      ls -l /bin/usr 2>ls-err.txt

      文件描述符“2”紧放在重定向符之前,将标准错误重定向到ls-err.txt文件中。

 

五、将标准输出和标准错误重定向到同一个文件

      在许多情况下,我们会希望把一个命令的所有输出内容都放在同一个独立的文件中。为此,我们必须同时重定向标准输出和标准错误。有两种方法可以满足要求。第一种是传统的方法,在旧版本的shell中使用。

      ls -l /bin/usr > ls-output.txt 2>&1

      使用这个方法,将执行两个重定向操作。首先重定向标准输出到ls-output.txt文件中,然后使用标记符2>&1把文件描述符2(标准错误)重定向到文件描述符1(标准输出)中。

      这些重定向操作的顺序是非常重要的。标准错误的重定向操作通常发生在标准输出重定向操作之后,否则它将不起作用。

      最近的bash版本提供了效率更高的第二种方法来实现这一联合的重定向操作。

      ls -l /bin/usr &> ls-output.txt

      在这个例子中,只使用一个标记符“&>”就把标准输出和标准错误都重定向到了ls-output.txt文件中。

 

六、处理不想要的输出

      有时候“沉默是金”,命令执行后我们并不希望得到输出,而是想把这个输出丢弃,尤其是在输出错误和状态信息的情况下更为需要。系统提供了一种方法,即通过把输出重定向到一个称为/dev/null的特殊文件中来实现它。这个文件是一个称为位桶(bit bucket)的系统设备,它接受输入但是不对输入进行任何处理。以下命令可以用来抑制(即隐藏)一个命令的错误信息。

      ls -l /bin/usr 2>/dev/null

      UNIX文化中的/dev/null,位桶(bit bucket)是一个古老的unix概念,由于它的普适性,它出现在unix文化的很多地方。因此当某人说他正在把你的意见发送到"dev null"的时候,现在你知道他是什么意思了:-)。

 

posted @ 2015-02-20 21:43  jplatformx  阅读(217)  评论(0编辑  收藏  举报