在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操作系统中的一个非凡文件,其回接受任何流的输入,但是不会增加文件的大小。但是这个文件的用途远远没有管道符的作用大。通常情况下,假如用来过滤一些标准的错误,那么采用这个文件的话比较合适。在其他情况下假如要让输入源不起作用的话,那么笔者建议系统工程师利用管道符来实现。

UNIX管道符的更多相关文章

  1. python django 模板

    1 用两个大括号括起来的文字{{person_name}} 称为变量 2 被 大括号和面分号包围的文件({% if ordered_warranty %})是模板标签 3 过滤器是用管道符(|) 和U ...

  2. Django模板修炼

    引言:由于我们在使用Django框架时,不会将HTML代码采用硬编码的方式,因为会有以下缺点: 1:对页面设计进行的任何改变都必须对 Python 代码进行相应的修改. 站点设计的修改往往比底层 Py ...

  3. Django模板语言(常用语法规则)

    Django模板语言 The Django template language 模板中常用的语法规则 {最新版本的Django语法可能有改变,不支持的操作可能支持了.[HTML教程 - 基本元素/标签 ...

  4. 【updating】python读书笔记-The Django Book2.0(for django1.4)

    原文:http://www.djangobook.com/en/2.0/frontmatter.html 译文:http://djangobook.py3k.cn/2.0/ 或者http://docs ...

  5. Django模板常用语法规则

    Django 模板标签 if/else 标签 for 标签 ifequal/ifnotequal 标签 注释标签 过滤器 include 标签 URL标签 模板继承   if/else 标签 1. 基 ...

  6. Python+Django+SAE系列教程10-----Django模板

    在本章中,我们开始模板,在前面的章节,您可能已经注意到,我们回到文本的方式有点特别的示例视图. 那.HTML直接在硬编码 Python 其中代码. 这的确是一个小BT. def current_dat ...

  7. Oracle DBA 的常用Unix参考手册(一)

    作为一名Oracle DBA,在所难免要接触Unix,但是Unix本身又是极其复杂的,想要深刻掌握同样很不容易.那么到底我们该怎么入手呢?Donald K Burleson 的<Unix for ...

  8. Unix/Linux笔记全集

    1:Unix/Linux操作系统概述 要求:理解应用软件和操作系统的区别,掌握系统的Kernel(核心)和shell(外壳)之间的关系以及各自的作用 Solaris:Solaris 是Sun Micr ...

  9. UNIX 是啥?!和Linux什么关系?

    操作系统有两大阵营,一边是基于微软 Windows NT 的操作系统,一边是由UNIX衍生下来的操作系统. Linux, Mac OS X, Android, iOS, Chrome OS甚至路由器上 ...

随机推荐

  1. 《Java编程思想》笔记 第二十章 注解

    1.注解 注解也称元数据,是在代码中添加信息的一种方式添加的信息提供给编译器或者工具类框架使用. SE5引入,可以提供用来完整描述程序所需要的信息,往往这些信息是无法用Java来表达的. 注解可以在编 ...

  2. Python 进阶 之 yield

    .转载自:https://www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/ Python yield 使用浅析: 您可能听说过, ...

  3. 通俗了解TCP/IP三次握手四次挥手

    前言: tcp/ip通信机制是计算机中很重要的一个知识点,不是一句两句就能解释清楚的,需要反复推敲其中的玄妙. 通俗理解: 但是为什么一定要进行三次握手来保证连接是双工的呢,一次不行么?两次不行么?我 ...

  4. 山东省第六届省赛 H题:Square Number

    Description In mathematics, a square number is an integer that is the square of an integer. In other ...

  5. C#调用耗时函数时显示进度条浅探

    最近在做一个VSS日志分析工具,使用C#进行开发,在完成了所有功能后,发现,从服务器下载VSS日志非常耗时,因为此,导致工具使用体验不好,所以,准备增加一个进度条.鉴于C#不经常使用,一下子搞个进度条 ...

  6. HDU 6330.Problem L. Visual Cube-模拟到上天-输出立方体 (2018 Multi-University Training Contest 3 1012)

    6330.Problem L. Visual Cube 这个题就是输出立方体.当时写完怎么都不过,后来输出b<c的情况,发现这里写挫了,判断失误.加了点东西就过了,mdzz... 代码: //1 ...

  7. php中parse_url函数的源码及分析(scheme部分)

    前言 看师傅们的文章时发现,parse_url出现的次数较多,单纯parse_url解析漏洞的考题也有很多,在此研究一下源码(太菜了看不懂,待日后再补充Orz) 源码 在ext/standard/ur ...

  8. 一个排好序的数组,找出两数之和为x的所有组合【双指针】

    #include <bits/stdc++.h> using namespace std; const int N = 1e6,INF = 0x3f3f3f3f; int a[N]; in ...

  9. 线段树【p2706】贪婪大陆

    Background 面对蚂蚁们的疯狂进攻,小FF的Tower defence宣告失败--人类被蚂蚁们逼到了Greed Island上的一个海湾.现在,小FF的后方是一望无际的大海, 前方是变异了的超 ...

  10. Hnoi2013题解 bzoj3139~3144

    话说好久没写题(解)了.. 先贴份题解:http://wjmzbmr.com/archives/hnoi-2013-%E9%A2%98%E8%A7%A3/(LJ神题解..Lazycal表示看不懂..) ...