标准输入与输出
执行一个Shell命令行时通常会自动打开3个标准文档,即标准输入文档(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系统为输入、输出的传送引入了另外两种机制,即输入/输出重定向和管道。
1.输入重定向
输入重定向是指把命令或可执行程序的标准输入重定向到指定的文件中。也就是说,输入可以不来自键盘,而来自一个指定的文件。所以说,输入重定向主要用于改变一个命令的输入源,特别是改变那些需要大量输入的输入源。例如,命令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文档的重定向操作符使用<<。它将一对分隔符号(分隔符号是由<<符号后的单词来定义的,本例中我们用eof来表示)之间的正文作为标准输入定向给命令。下例将一对分隔符号eof之间的正文作为wc命令的输入,统计出正文的行数、单词数和字符数。
[root@mail root]# wc << eof
> hello
> world
> are you here?
> eof
3 5 26
在<<操作符后面,任何字符或单词都可以作为正文开始前的分隔符号,本例中使用eof就作为分隔符号。here文档的正文一直延续到遇见另一个分隔符号为止。第二个分隔符号应出现在新行的开头。这时here文档的正文(不包括开始和结束的分隔符号)将重新定向送给命令wc作为它的标准输入。
由于大多数命令都以参数的形式在命令行上指定输入档的文件名,所以输入重定向并不经常使用。尽管如此,当要使用一个不接受档名作为输入参数的命令,而需要的输入内容又存在一个文档里时,就能用输入重定向解决问题。