全国业务电话:
1.5 重定向和管道
1.5 重定向和管道
 
  执行一个 Shell 命令行通常会自动打开三个标准文件,即标准输入文件(stdin ) ,通常对应终端的键盘;标准输出文件(stdout)和标准错误输出文件(stderr),这两个文件通常都对应终端的屏幕。进程从标准输入文件中得到数据,将正常输出数据输出到标准输出文件,而将错误信息送到标准错误文件中。
 
  下面以 cat 命令为例,cat 命令的功能是从命令行给出的文件中读取数据,并将这些数据直接送到标准输出。例如,使用以下命令:
 
    #cat config  
 
  将会把文件 config 的内容依次显示到屏幕上。但是,如果 cat 的命令行中没有参数,它就会从标准输入中读取数据,并将其送到标准输出。例如:
 
    #cat             
                        
    Hello world  
                        
    Hello world  
 
  直接使用标准输入/输出文件存在以下问题:
 
  l、数据从标准终端输入时,输入的数据只能用一次,下次再想用这些数据时就需要重新输入;而且在终端上输入时,若输入有误修改起来也不方便;
 
  2、输出到终端屏幕上的信息只能看不能修改。用户无法对输出的内容进行更多处理,如将输出作为另一命令的输入进行进一步的处理等。
 
  为了解决上述问题,Linux 系统为输入、输出的传送引入了另外两种机制,即输入/输出重定向和管道。
  
1.5.1 输入重定向
 
  输入重定向是指把命令(或可执行程序)的标准输入重定向到指定的文件中。也就是说,输入可以不是来自于键盘,而来自一个指定的文件。
 
  例如,命令 wc 统计指定文件包含的行数、单词数和字符数。如果仅在命令行上键入:
 
    #wc  
 
  wc 将等待用户的输入,从键盘键入的所有文本都出现在屏幕上,但并没有结果,直至按下<Ctrl + D> ,wc 才将命令结果写在屏幕上。
 
  如果给出一个文件名作为 wc 命令的参数,wc 将返回该文件所包含的行数、单词数和字符数。
 
  另一种把/etc/passwd 文件内容传给 wc 命令的方法是重定向 wc 的输入。输入重定向的一般形式为:
 
    #command < filename  
 
  可以用下面的命令把 wc 命令的输入重定向为/etc/passwd 文件:
 
    wc < /etc/passwd  
                                 
    20 23 726               
 
  大多数命令都以参数的形式在命令行指定输入文件的文件名,所以输入重定向并不经常使用。尽管如此,当使用一个不接受文件名作为输入参数的命令,或需要的输入内容存在于一个文件里时,就能用输入重定向解决问题。

1.5.2 输出重定向
 
  输出重定向是指把命令(或可执行程序)的标准输出或标准错误输出重新定向到指定文件中。这样,该命令的输出就不显示在屏幕上,而是写入到指定文件中。
 
  输出重定向比输入重定向更常用。例如,如果某个命令的输出很多,在屏幕上不能完全显示,那么将输出重定向到一个文件中,然后再用文本编辑器打开这个文件,就可以查看输出信息;如果想保存一个命令的输出,也可以使用这种方法。还有,输出重定向可以用于把一个命令的输出当作另一个命令的输入。
 
  输出重定向的一般形式为:

    #command > filename  
 
  例如:
 
    #ls > directory.out                                                
                                                                                 
    #cat directory.out                                                  
                                                                                 
    chl.doc ch2.doc ch3.doc chimp config mail /test/  
 
  将 ls 命令的输出保存为一个名为 directoryout 的文件。
 
  提示:如果>符号后的文件已存在,那么这个文件将被覆盖。
 
  为避免输出重定向中指定文件只能存放当前命令的输出重定向的内容,Shell 提供了输出重定向的一种追加手段。
 
  输出追加重定向与输出重定向的非常相似,区别仅在于输出追加重定向的功能是把命令(或可执行程序)的输出结果追加到指定文件的最后,而该文件原有内容不被破坏。
 
  如果要将一条命令的输出结果追加到指定文件的后面,可以使用追加重定向操作符“> >”。形式为:
 
    #command >> filename  
 
  例如:
 
    #ls *.doc > > directory.out                                    
                                                                                 
    #cat directory.out                                                  
                                                                                 
    chl.doc chZdoc ch3doc chimp config mail / test /  
                                                                                 
    chl.doc ch2.doc ch3.doc                                         
 
  和程序的标准输出重定向一样,程序的错误输出也可以重新定向。使用符号2>(或追加符号2> >)表示对错误输出设备重定向。例如下面的命令:
 
    #ls /usr/tmp 2> err.file  
 
  可在屏幕上看到程序的正常输出结果,但又将程序的任何错误信息送到文件err.file 中,以备将来检查用。
 
  还可以使用另一个输出重定向操作符(& >)将标准输出和错误输出同时送到同一文件中。例如:
 
    #ls /usr/tmp &> output.file  

  利用重定向将命令组合在一起,可实现系统单个命令不能提供的新功能。例如使用下面的命令序列,即统计了/usr/bin 目录下的文件个数。
 
    #ls /usr/bin > /tmp/dir  
                                          
    #wc -w < /tmp/dir          
                                          
    459                                 
 
1.5.3 管道
 
  将一个程序或命令的输出作为另一个程序或命令的输入有两种方法,一种是通过一个临时文件将两个命令或程序结合在一起,例如上节例子中的/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  
                                                                   
    那么该管道行的结果是 2 。                          
 

  • 操作系统微信公众号

  • CPI微信公众号

© 2004-2020 广东中兴新支点技术有限公司  版权所有  (www.gd-linux.com)  粤ICP备15061780号-2

新支点OS业务:

QQ客服