荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: tian.bbs@bbs.tju.edu.cn (Fastboot in C++), 信区: Linux
标  题: 教程>>>>>第二十一课 标准I/O和重定向
发信站: 天大求实BBS站 (Mon Jun  2 20:00:39 2003)
转信站: SZU!news.tiaozhan.com!UTJ


Linux教程>>>>>第二十一课 标准I/O和重定向
  1. 标准输入与输出

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

  我们以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就好象死了一样,从键盘键入的所有
文本都出现在屏幕上,但并没有什么结果,直至按下,wc才将命令结果写在屏幕上。


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

  $ wc /etc/passwd

  20 23 726 /etc/passwd

  $

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

  $ 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

  利用重定向将命令组合在一起,可实现系统单个命令不能提供的新功能。例如使
用下面的命令序列:

  $ ls /usr/bin > /tmp/dir

  $ wc –w < /tmp/dir

  459

  统计了/usr/bin目录下的文件个数。

  管 道

  将一个程序或命令的输出作为另一个程序或命令的输入,有两种方法,一种是通
过一个临时文件将两个命令或程序结合在一起,例如上个例子中的/tmp/dir文件将ls
和wc命令联在一起;另一种是Linux所提供的管道功能。这种方法比前一种方法更好


  管道可以把一系列命令连接起来,这意味着第一个命令的输出会作为第二个命令
的输入通过管道传给第二个命令,第二个命令的输出又会作为第三个命令的输入,以
此类推。显示在屏幕上的是管道行中最后一个命令的输出(如果命令行中未使用输出
重定向)。

  通过使用管道符“|”来建立一个管道行。用管道重写上面的例子:

  $ ls /usr/bin|wc -w

  1789

  再如:

  $ cat sample.txt|grep "High"|wc -l

  管道将cat命令(列出一个文件的内容)的输出送给grep命令。grep命令在输入里
查找单词High,grep命令的输出则是所有包含单词High的行,这个输出又被送给wc命
令,wc命令统计出输入中的行数。假设sample.txt文件的内容如下:

  Things to do today:

  Low:Go grocery shopping

  High:Return movie

  High:Clear level 3 in Alien vs. Predator

  Medium:Pick up clothes from dry cleaner

  那么该管道行的结果是2。

  命令替换

  命令替换和重定向有些相似,但区别在于命令替换是将一个命令的输出作为另外
一个命令的参数。常用命令格式为:

  command1 `command2`

  其中,command2的输出将作为command1的参数。需要注意的是这里的`符号,被
它括起来的内容将作为命令执行,执行后的结果作为command1的参数。例如:

  $ cd `pwd`

  该命令将pwd命令列出的目录作为cd命令的参数,结果仍然是停留在当前目录下







--
 The Best Way Of Learning To Use 【The Linux】 Is To Use It.
※ 来源:·天大求实 bbs.tju.edu.cn·[FROM: 天大求实BBS站]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店