UNIX管道符

在Unxi操作系统中,标准输入和标准输出是外壳程序中可以单独使用的两个独立流。但是有时候系统工程师需要让某些特定的输入源不起作用。当系统工程师在开发一些实用的脚本程序的过程中,经常需要用到。
 
一、在什么时候需要让输入源不起作用?
在什么时候需要让输入源不起作用呢?这个是举不胜举呀。笔者在这里就举两个比较简单的例子。
一是在统计文件大小的时候需要用到。如现在系统工程师需要统计当前目录下所有文本文件的大小,通常情况下可以使用wc –c .txt命令。利用这个命令后,操作系统会显示当前目录下所有的文本文件以及对应的大小,然后在最后以行再统计文本文件的总大小。但是在编写一些脚本程序的时候可能只需要用到文件的总大小即可,而不需要每个文件的大小。如在Unix操作系统上部署了Oracle数据库以后,会产生一些日志文档。数据库治理员为了安全等方面考虑,需要定期对这些日志进行清理。此时数据库治理员可能要求Unix系统工程师让操作系统天天统计一下这些日志文件的大小,当这些文件的容量达到一定的数值时就能够自动通知数据库治理员让他进行处理。由于这个脚本程序中涉及到一个逻辑判定的问题,为此在返回的结果中只需要有最终的文件总大小即可。假如又有明细、又有总大小的话,反而不能够用来做逻辑运算符的参数。所以此时需要让某些输入源不起作用。类似的情况还有很多。如在编写磁盘限额治理工具时,当用户从网络上或者其他地方复制文件之前,先需要统计目标文件的总大小。假如目标文件的总大小要比可用的空间少的话,那么就直接拒绝,而不是等到放不下的时候再向用户说明。这就会浪费用户的时间。此时也只需要用到一个文件的总大小即可。
 
二是需要过滤一些错误输入流。
如在使用find命令查找文件的时候,假如需要查找的目录当前用户没有相关的权限,则系统提示一些错误。但是假如当用户的权限比较小而且用户又在整个操作系统内查找的话,则错误就会比较多,会影响用户的阅读。此时也需要让这些错误输入流不起作用。
综上所述,在很多地方都需要让输入源不起作用。那么在Unix操作系统中是如何实现这个目标的呢?
 
三、如何通过管道符让输入源不起作用?
在Unix操作系统中,可以通过管道符来让某些输入源不起作用。Unix操作系统中的管道是指标准输入和标准输出的第三种源和目标。简单的说,管道符可以把标准输入流与标准输出流进行合并;或者把某个命令的标准输出流作为另外一个命令的标准输入流。而这个管道符跟其他命令结合使用的话,能够实现一些比较复杂的需求。
如现在系统工程师想统计Oracle数据库目录下文本文件的大小,那么系统工程师就可以先切换到Oracle数据库的目录下,然后使用cat .txt wc –c命令。这个命令就是通过管道符把两个基本命令结合起来,让操作系统显示文件总的大小。那么这个命令具体是如何实现这个功能的呢?
首先,cat .txt命令会把当前目录下所有txt文件进行合并。Cat命令主要用来读取文件的内容。这个命令可以同时打开多个文件。假如同时打开多个文件的话,则cat命令会把文件的内容进行合并。即把第二个文件的内容直接加入到第一个文件的后面。在中间的话不会加入任何提示符。虽然这对于阅读可能不怎么方便的,但是却最真实的反映出来了文件本身的内容,没有经过任何的修饰。
其次管道符的作用就是把cat命令的标准输出流当作wc命令的一个标准输入流。而wc命令加上-c选项就是用来统计标准输入流的大小。所有这个命令就可以统计出Oracle目录下所有txt文件的大小,而不是统计每个文件的大小。也就是说起到了让某系输入源不起作用的目标。得到这个数值之后,系统工程师就可以通过IF判定语句或者其他命令来实现一些特定的目的。
 
四、管道符的使用有哪些注重事项?
管道符是Unix操作系统中的一个重要工具,是Windwos操作系统不具备的一个重大改进。众所周知,Unix操作系统在设计的时候,遵循的是小就是没的设计原则,每个命令只完成一些简单的功能。如上面这个例子中,Unix操作系统设计者完全可以在wc命令中加入一个参数,让wc命令只显示最终结果,而不显示明细。但是设计者却没有这么做。因为假如要这么处理的话,那么就需要给很多命令都加入这个选项。那就破坏了Unix操作系统小即是美的设计原则。为此Unix系统设计者推进系统工程师采用管道符把多个流合并起来,让一个命令的输出作为另一个命令的输入,来实现命令之间的组合。为此管道符是Unix操作系统中的核心。基本上每一个实用的脚本程序都能够看到管道符的存在。为此作为系统工程师,必须要了管道符的用法。根据笔者的经验,从理论上来说管道符很简单。在任何一本教科书上,对于管道符的介绍估计都不会超过五页。但是管道符的内容远远比这些书上说的要多。也就是说,系统工程师要用好管道符,主要是要靠日后工作中经验的积累。说句比较具有哲理的话,就是管道符的应用只可意会、不可言传。为此笔者觉得管道符的应用效果直接跟系统工程师的工作经验有关。为此笔者建议,大家要提高对管道符的熟悉的话,那么最好的方法就是去看一些过来人编写的脚本程序。从这些脚本程序中,系统工程师可以有不少的收获。笔者现在也经常看一些恐龙级专家所编写的程序,还往往能够从中学到一些管道符的应用经验。总之,从书本上基本上学不到管道符的高级技巧。要成为一个管道符应用的高手,夺取观摩专家写的程序是一个捷径。
另外笔者再跟大家介绍一条管道符应用的基本规则。把握这条规则无论是对于大家观摩其他人写的程序,或者是自己在用到管道符时都非常的有用。这条规则就是管道符左侧的命令必须使用标准输出,而右侧的命令必须使用标准输入。也就是说,系统工程师看到一个比较复杂的命令,有五六个管道符组成。此时不用慌,只需要从左到右一个个看下去即可。前一个命令是一个标准输出,其输出的结果就是下一个命令的输入参数,以此类推即可。
通过管道符可以把一些简单的命令组合起来实现复杂的功能。为此有些专家也把Unix操作系统形象的比喻从搭积木的游戏。一个个小木块就是Unix操作系统的命令,假如把这些木块通过插口把他们组合成一个好看的模型玩具,这不仅要求用户有比较扎实的基本知识,了解各个命令的用法;而且还要求系统工程师具有一定的想象力。因为只有具有想象力,才能够把本来互不相关的命令结合起来,以完成一些复杂的功能。恐怕这也是Unix操作系统对于系统工程师提出的一个比较非凡的要求。其他开发语言或则操作系统对于这方面的要求估计都没有Unix操作系统这么强烈。为此系统工程师在使用管道符的时候,要具有创造性,要敢于尝试。
为此笔者认为系统工程师在使用管道符的时候,要善于从其他专家的程序中取经、要善于想象,并遵循管道符应用的基本规则。只有如此,系统工程师才有可能成为管道符应用层面的专家。
四、有否其他的解决方式?
通过管道符可以让某些输入源不起作用。不过在Unix操作系统中还提供了一个非凡的文件,也可以实现过滤的作用。这个文件就是/dev/null文件。这是Unix操作系统中的一个非凡文件,其回接受任何流的输入,但是不会增加文件的大小。但是这个文件的用途远远没有管道符的作用大。通常情况下,假如用来过滤一些标准的错误,那么采用这个文件的话比较合适。在其他情况下假如要让输入源不起作用的话,那么笔者建议系统工程师利用管道符来实现。
原文地址:https://www.cnblogs.com/Simon-xm/p/3890754.html