重定向和管道是Sheel的一种高级特性,这种特性允许用户人为改变程序获取输入和产生输出的位置,这个有趣的功能并不是Linux的专利,几乎所有的操作系统,包括windows都支持这样的操作
输出重定向
程序在默认情况下输出结果的地方被称为标准输出(stdout)standard out的缩写,通常来说,标准输出总是指向显示器
例如下面的 ls 命令获取当前目录下的文件列表,并将其输出到标准输出,于是用户在屏幕上看到了这些文件名
$ ls bin check etc ipInfo lib64 media mnt opt picture root selinux sys tmp usr waspak app boot dev home lib misc net pay proc sbin
输出重定向用于把程序的输出转移到另一个地方去,下面这条命令将 ls 的输出重定向到 lsout 文件中
$ ls > ~/ls_out
这样,ls的输出就不会显示在显示器上,而是出现在用户主目录的 ls_out文件中,每行显示一个文件名
$ cat ~/ls_out bin check etc ipInfo ...
如果ls_out文件不存在,那么输出重定向符号“>”会试图建立这个文件,如果ls_out文件已经存在,那么">"会删除文件中原有的内容,然后用新的内容替换
$ uname -r -> ls_out $ cat ls_out 2.6.18-194.el5
可以看到,">"并不会礼貌的在原来那堆文件名的后面加上版本信息,而是直接覆盖了,如果要保留原来文件中的内容,应该是用输出重定向符号">>"
$ date -> date_out $ cat date_out 2016年11月20日 星期日 20:43:43 CST $ uname -r ->> date_out $ cat date_out 2016年11月20日 星期日 20:43:43 CST 2.6.18-194.el5
输入重定向
和标准输出类似,程序默认情况下接受输入的地方被称为标准输入stdin(standard in的缩写),通常来说,标准输入总是指向键盘,例如,如果使用不带任何参数的cat命令,那么cat会停在那里等待标准输入(也就是键盘)获取数据
$ cat
用户的每一行输入会立即显示在屏幕上,直到使用Ctrl+D快捷键提供给cat一个文件结束符。
Hello Hello Bye Bye <Ctrl+D>
通过使用输入重定向符号“<”可以让程序从一个文件中获取输入
$ cat < days Monday Tuesday Wednesday Thursday Friday Saturday Sunday
上面这条命令将文件days作为输入传递给cat命令,cat读取days中的每一行,然后输出读到的内容,最后当cat遇到文件结束符时,就停止读取操作,这个过程同先前完全一致
正如读者已经想到的,cat命令可以通过接受一个参数来显示文件内容,因此“cat < days”完全可以用cat days来替代,实际上,大部分命令都能够以参数形式在命令行上指定输入档的文件名,因此输入重定向并不经常使用
另一种输入重定向的例子被称为立即文档(here document),这种重定向方式使用操作符"<<",立即文档明确告诉Shell从键盘接受输入,并传递给程序,现在看下面这个例子
$ cat << EOF > Hello > Bye > EOF Hello Bye
cat命令从键盘接受两行输入,并将其送往标准输出,和开头例子不同的是,,立即文档指定了一个代表输入结束的分隔符(上面例子中是代词EOF),当Sheel遇到这个单词的时候,就人文输入结束,并把刚才的键盘输入一起传递给命令。所以这次 cat 命令会将用户的输入一块儿显示,而不是每首到一行就迫不及待的把它打印出来
用户可以选择任意一个单词作为立即文档的分隔符,就像EOF,END,eof等都是不错的选择,只要可以确保它不是正文的一部分
那么,是否可以让输入重定向和输出重定向结合使用呢?听起来很不错的注意
$ cat << END > hello > Hello World! > Bye > END
这条命令首先让 cat 命令以立即文档的方式获取输入,然后把 cat的输出重定向到hello文件,查看hello文件,应该看到下面这些内容
Hello World! Bye
管道:|
管道将“重定向”再向前推进了一步,通过一根竖线“|”,将一条命令的输出连接到另一条命令输入,下面这条命令显示了如何再文件列表中查找文件名中包含某个特定字符串的文件
$ ls | grep ay days hard_days mplayer my_days
ls 首先列出当前目录下的所有文件名,管道"|"接收到这些输出,并把它们发给grep命令作为其输入,最后 grep 在这堆文件列表中查找包含字符串 ay 的文件名,并在标准输出(显示器)显示。
可以在一行命令中使用多个管道,从而构造出复杂的Shell命令,最初这些命令可能看起来晦涩难懂,但它们的确很搞笑,合理使用管道是提高工作效率的有效手段,随着使用的深入,相信各位读者以后会经常用到它的重要性!