谈到pipe line,我相信不少人都不会陌生:我们在很多command line上常看到的“|”符号就是pipe line了。不过,究竟pipe line是甚么东东呢?别急别急…先查一下英汉字典,看看pipe是甚么意思?没错﹗它就是“水管”的意思…那么,你能想像一下水管是怎么一根接着一根的吗?又,每根水管之间的input跟output又如何呢?嗯??灵光一闪:原来pipe line的I/O跟水管的I/O是一模一样的:上一个命令的stdout接到下一个命令的stdin去了!的确如此…不管在command line上你使用了多少个pipe line,前后两个command的I/O都是彼此连接的﹗(恭喜:你终于开窍了﹗^_^)
不过…然而…但是……stderr呢?好问题﹗不过也容易理解:若水管漏水怎么办?也就是说:在pipe line之间,前一个命令的stderr是不会接进下一命令的stdin的,其输出,若不用2>导到file去的话,它还是送到摄像头上面来﹗这点请你在pipe line运用上务必要注意的。那,或许你又会问:有办法将stderr也喂进下一个命令的stdin去吗?(贪得无厌的家伙﹗)方法当然是有,而且你早已学过了﹗^_^ 我提示一下就好:请问你如何将stderr合并进stdout一同输出呢?若你答不出来,下课之后再来问我吧…(如果你脸皮真够厚的话…)
或许,你仍意尤未尽﹗或许,你曾经碰到过下面的问题:
在cm1 | cm2 | cm3…这段pipe line中,若要将cm2的结果存到某一档案呢?
若你写成cm1 | cm2 > file | cm3的话,那你肯定会发现cm3的stdin是空的﹗(当然啦,你都将水管接到别的水池了﹗)聪明的你或许会如此解决:cm1 | cm2 > file; cm3 < file 是的,你的确可以这样做,但最大的坏处是:这样一来,file I/O会变双倍﹗在command执行的整个过程中,file I/O是最常见的最大性能杀手。凡是有经验的shell操作者,都会尽量避免或降低file I/O的频率。那,上面问题还有更好方法吗?有的,那就是tee命令了。
所谓tee命令是在不影响原本I/O的情况下,将stdout复制一份到档案去。因此,上面的命令行可以如此打:
cm1 | cm2 | tee file | cm3
在预设上,tee会改写目标档案,若你要改为增加内容的话,那可用-a参数达成。
基本上,pipe line的应用在shell操作上是非常广泛的,尤其是在text filtering方面,
凡举cat,more,head,tail,wc,expand,tr,grep,sed,awk,…等等文字处理工具,搭配起pipe line来使用,你会惊觉command line原来是活得如此精彩的﹗常让人有“众里寻他千百度,蓦然回首,那人却在灯火阑珊处﹗”之感…^_^
你要 if 還是 case 呢?
放了一个愉快的春节假期,人也变得懒懒散散的…只是,答应了大家的作业,还是要坚持完成就是了~~~
还记得我们在第10章所介绍的return value吗?是的,接下来介绍的内容与之有关,若你的记忆也被假期的欢乐时光所抵消掉的话,那,建议您还是先回去温习温习再回来…










