1、LINUX 标准输入输出和重定向1. 标准输入与输出我们知道,执行一个 shell 命令行时通常会自动打开三个标准文件,即标准输入文件(stdin),通常对应终端的键盘;标准输出文件(stdout)和标准错误输出文件(stderr ),这两个文件都对应终端的屏幕。进程将从标准输入文件中得到输入数据,将正常输出数据输出到标准输出文件,而将错误信息送到标准错误文件中。我们以 cat 命令为例,cat 命令的功能是从命令行给出的文件中读取数据,并将这些数据直接送到标准输出。若使用如下命令:$ cat config将会把文件 config 的内容依次显示到屏幕上。但是,如果 cat 的命令行中没有参数
2、,它就会从标准输入中读取数据,并将其送到标准输出。例如:$ catHello worldHello worldByeBye$用户输入的每一行都立刻被 cat 命令输出到屏幕上。另一个例子,命令 sort 按行读入文件正文(当命令行中没有给出文件名时,表示从标准输入读入),将其排序,并将结果送到标准输出。下面的例子是从标准输入读入一个采购单,并将其排序。$ sortbananascarrotsapplesapplesbananascarrots$ 这时我们在屏幕上得到了已排序的采购单。直接使用标准输入/输出文件存在以下问题:输入数据从终端输入时,用户费了半天劲输入的数据只能用一次。下次再想用这些
3、数据时就得重新输入。而且在终端上输入时,若输入有误修改起来不是很方便。输出到终端屏幕上的信息只能看不能动。我们无法对此输出作更多处理,如将输出作为另一命令的输入进行进一步的处理等。为了解决上述问题,Linux 系统为输入、输出的传送引入了另外两种机制,即输入/输出重定向和管道。 2. 输入重定向 输入重定向是指把命令(或可执行程序)的标准输入重定向到指定的文件中。也就是说,输入可以不来自键盘,而来自一个指定的文件。所以说,输入重定向主要用于改变一个命令的输入源,特别是改变那些需要大量输入的输入源。例如,命令 wc 统计指定文件包含的行数、单词数和字符数。如果仅在命令行上键入:$ wcwc 将等
4、待用户告诉它统计什么,这时 shell 就好象死了一样,从键盘键入的所有文本都出现在屏幕上,但并没有什么结果,直至按下ctrl+d,wc 才将命令结果写在屏幕上。如果给出一个文件名作为 wc 命令的参数,如下例所示, wc 将返回该文件所包含的行数、单词数和字符数。$ wc /etc/passwd20 23 726 /etc/passwd$另一种把/etc/passwd 文件内容传给 wc 命令的方法是重定向 wc 的输入。输入重定向的一般形式为:命令this text forms the contentof the here document,whichcontinues until the
5、 end oftext delimterdelim4 17 98在文件名。例如:$ ls directory.out$ cat directory.outch1.doc ch2.doc ch3.doc chimp config mail/ test/$将 ls 命令的输出保存为一个名为 directory.out 的文件。注:如果符号后边的文件已存在,那么这个文件将被重写。为避免输出重定向中指定文件只能存放当前命令的输出重定向的内容,shell 提供了输出重定向的一种追加手段。输出追加重定向与输出重定向的功能非常相似,区别仅在于输出追加重定向的功能是把命令(或可执行程序)的输出结果追加到指定文
6、件的最后,而该文件原有内容不被破坏。如果要将一条命令的输出结果追加到指定文件的后面,可以使用追加重定向操作符。形式为:命令 文件名。例如:$ ls *.docdirectory.out$ cat directory.outch1.doc ch2.doc ch3.doc chimp config mail/ test/ch1.doc ch2.doc ch3.doc$和程序的标准输出重定向一样,程序的错误输出也可以重新定向。使用符号 2(或追加符号 2)表示对错误输出设备重定向。例如下面的命令:$ ls /usr/tmp 2 err.file可在屏幕上看到程序的正常输出结果,但又将程序的任何错误信
7、息送到文件 err.file 中,以备将来检查用。还可以使用另一个输出重定向操作符(&)将标准输出和错误输出同时送到同一文件中。例如:$ ls /usr/tmp & output.file利用重定向将命令组合在一起,可实现系统单个命令不能提供的新功能。例如使用下面的命令序列:$ ls /usr/bin /tmp/dir$ wc w /tmp/dir459统计了/usr/bin 目录下的文件个数。管 道将一个程序或命令的输出作为另一个程序或命令的输入,有两种方法,一种是通过一个临时文件将两个命令或程序结合在一起,例如上个例子中的/tmp/dir 文件将 ls 和 wc 命令联在一起;另一种是 L
8、inux 所提供的管道功能。这种方法比前一种方法更好。 管道可以把一系列命令连接起来,这意味着第一个命令的输出会作为第二个命令的输入通过管道传给第二个命令,第二个命令的输出又会作为第三个命令的输入,以此类推。显示在屏幕上的是管道行中最后一个命令的输出(如果命令行中未使用输出重定向)。通过使用管道符“|” 来建立一个管道行。用管道重写上面的例子:$ ls /usr/bin|wc -w1789再如:$ cat sample.txt|grep “High“|wc -l管道将 cat 命令(列出一个文件的内容)的输出送给 grep 命令。grep 命令在输入里查找单词 High,grep 命令的输出则
9、是所有包含单词 High 的行,这个输出又被送给 wc 命令,wc 命令统计出输入中的行数。假设 sample.txt 文件的内容如下:Things to do today:Low:Go grocery shoppingHigh:Return movieHigh:Clear level 3 in Alien vs. PredatorMedium:Pick up clothes from dry cleaner那么该管道行的结果是 2。命令替换命令替换和重定向有些相似,但区别在于命令替换是将一个命令的输出作为另外一个命令的参数。常用命令格式为:command1 command2其中,command2 的输出将作为 command1 的参数。需要注意的是这里的符号,被它括起来的内容将作为命令执行,执行后的结果作为 command1 的参数。例如:$ cd pwd该命令将 pwd 命令列出的目录作为 cd 命令的参数,结果仍然是停留在当前目录下。