Linux教程(21)-标准输入/输出和重定向

2008-02-23 05:30:12来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

1. 标准输入和输出

我们知道,执行一个shell命令行时通常会自动打开三个标准文档,即标准输入文档(stdin),通常对应终端的键盘;标准输出文档(stdout)和标准错误输出文档(stderr),这两个文档都对应终端的屏幕。进程将从标准输入文档中得到输入数据,将正常输出数据输出到标准输出文档,而将错误信息送到标准错误文档中。

我们以cat命令为例,cat命令的功能是从命令行给出的文档中读取数据,并将这些数据直接送到标准输出。若使用如下命令:

$ cat config

将会把文档config的内容依次显示到屏幕上。但是,假如cat的命令行中没有参数,他就会从标准输入中读取数据,并将其送到标准输出。例如:

$ cat

Hello world

Hello world

Bye

Bye



$

用户输入的每一行都立即被cat命令输出到屏幕上。

另一个例子,命令sort按行读入文档正文(当命令行中没有给出文档名时,表示从标准输入读入),将其排序,并将结果送到标准输出。下面的例子是从标准输入读入一个采购单,并将其排序。

$ sort

bananas

carrots

apples



apples

bananas

carrots

$

这时我们在屏幕上得到了已排序的采购单。

直接使用标准输入/输出文档存在以下问题:

输入数据从终端输入时,用户费了半天劲输入的数据只能用一次。下次再想用这些数据时就得重新输入。而且在终端上输入时,若输入有误修改起来不是很方便。

输出到终端屏幕上的信息只能看不能动。我们无法对此输出作更多处理,如将输出作为另一命令的输入进行进一步的处理等。

为了解决上述问题,Linux系统为输入、输出的传送引入了另外两种机制,即输入/输出重定向和管道。

输入重定向

输入重定向是指把命令(或可执行程式)的标准输入重定向到指定的文档中。也就是说,输入能够不来自键盘,而来自一个指定的文档。所以说,输入重定向主要用于改变一个命令的输入源,特别是改变那些需要大量输入的输入源。

例如,命令wc统计指定文档包含的行数、单词数和字符数。假如仅在命令行上键入:

$ wc

wc将等待用户告诉他统计什么,这时shell就好象死了相同,从键盘键入的任何文本都出现在屏幕上,但并没有什么结果,直至按下<ctrl d>,wc才将命令结果写在屏幕上。

假如给出一个文档名作为wc命令的参数,如下例所示,wc将返回该文档所包含的行数、单词数和字符数。

$ wc /etc/passwd

20 23 726 /etc/passwd

$

另一种把/etc/passwd文档内容传给wc命令的方法是重定向wc的输入。输入重定向的一般形式为:命令<文档名。能够用下面的命令把wc命令的输入重定向为/etc/passwd文档:

$ wc < /etc/passwd

20 23 726

$

另一种输入重定向称为here文档,他告诉shell当前命令的标准输入来自命令行。here文档的重定向操作符使用<<。他将一对分隔符(本例中用delim表示)之间的正文重定向输入给命令。下例将一对分隔符delim之间的正文作为wc命令的输入,统计出正文的行数、单词数和字符数。

$ wc<
>this text forms the content

>of the here document,which

>continues until the end of

>text delimter

>delim

4 17 98

在<<操作符后面,任何字符都能够作为正文开始前的分隔符,本例中使用delim作为分隔符。here文档的正文一直延续到遇见另一个分隔符为止。第二个分隔符应出现在新行的开头。这时here文档的正文(不包括开始和结束的分隔符)将重新定向送给命令wc作为他的标准输入。

由于大多数命令都以参数的形式在命令行上指定输入文档的文档名,所以输入重定向并不经常使用。尽管如此,当要使用一个不接受文档名作为输入参数的命令,而需要的输入内容又存在一个文档里时,就能用输入重定向解决问题。

输出重定向

输出重定向是指把命令(或可执行程式)的标准输出或标准错误输出重新定向到指定文档中。这样,该命令的输出就不显示在屏幕上,而是写入到指定文档中。

输出重定向比输入重定向更常用,很多情况下都能够使用这种功能。例如,假如某个命令的输出很多,在屏幕上不能完全显示,那么将输出重定向到一个文档中,然后再用文本编辑器打开这个文档,就能够查看输出信息;假如想保存一个命令的输出,也能够使用这种方法。更有,输出重定向能够用于把一个命令的输出当作另一个命令的输入(更有一种更简单的方法,就是使用管道,将在下面介绍)。

输出重定向的一般形式为:命令>文档名。例如:

$ ls > directory.out

$ cat directory.out

ch1.doc ch2.doc ch3.doc chimp config mail/ test/

$

将ls命令的输出保存为一个名为directory.out的文档。

注:假如>符号后边的文档已存在,那么这个文档将被重写。

为避免输出重定向中指定文档只能存放当前命令的输出重定向的内容,shell提供了输出重定向的一种追加手段。输出追加重定向和输出重定向的功能很相似,区别仅在于输出追加重定向的功能是把命令(或可执行程式)的输出结果追加到指定文档的最后,而该文档原有内容不被破坏。

假如要将一条命令的输出结果追加到指定文档的后面,能够使用追加重定向操作符>>。形式为:命令>>文档名。例如:

$ ls *.doc>>directory.out

$ cat directory.out

ch1.doc ch2.doc ch3.doc chimp config mail/ test/

ch1.doc ch2.doc ch3.doc

$

和程式的标准输出重定向相同,程式的错误输出也能够重新定向。使用符号2>(或追加符号2>>)表示对错误输出设备重定向。例如下面的命令:

$ ls /usr/tmp 2> err.file

可在屏幕上看到程式的正常输出结果,但又将程式的任何错误信息送到文档err.file中,以备将来检查用。

还能够使用另一个输出重定向操作符(&>)将标准输出和错误输出同时送到同一文档中。例如:

$ ls /usr/tmp &> output.file

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: Linux教程(22)-在Bash中的操作

下一篇: Linux教程(20)-shell命令