linux管道学习

linux管道学习

ID:32366630

大小:89.50 KB

页数:14页

时间:2019-02-03

linux管道学习_第1页
linux管道学习_第2页
linux管道学习_第3页
linux管道学习_第4页
linux管道学习_第5页
资源描述:

《linux管道学习》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、Linux管道学习知识点:1.管道左右的命令是并行执行的,而且是从右向左执行的,因此就需要在执行命令之前先对标准输出流及错误流等各种流进行分析,分析清楚了之后,也就相当于已经制定好了计划(打个比方,就相当于排水管道全部已经铺设完成,只等着各种水流来流动),然后并行启动程序,这里还要强调的是,这里的并行指的是“有依赖关系的并行”,反正大家不要理解成“必须前一条命令执行完毕,出来结果之后才能送给后续的命令接着处理”就可以了。2.基本的FD只有3个,即0、1、2,其他的需要手动开启,开启的方法是:exec[3到255之间的数]>&[0到2之间的数];关闭的方法是:ex

2、ecnum>&-。3.还要很清楚子shell的概念,除了bash内建的那些指令之外,其他的指令都相当于先fork再exec,也就是用子shell来执行的,还有shell及其他各种脚本也都是在子shell中执行的(详情请参考《shell编程之shell问答录》)。子shell会继承父shell中已经打开的FD,注意子shell只会知道父shell中开启了哪些FD,但并不会知道父shell中的各个FD是怎样的一个关系,例如究竟是2>&1了呢,还是1>&2了呢,这些信息子shell都是不会知道的。4.查看当前打开了哪些FD,有两种方法:ls/proc/$$/fd或者l

3、sof-p$$(观察最后几行即可)5.任何一个FD都是指向屏幕的(用ls-l/proc/$$/fd便可以看出它们指向的是同一个设备文件),至于谁是输入谁是输出,是由<和>决定的,和0、1、2没有关系6.管道

4、只接受标准输出流;屏幕回显使用得是标准错误流;s=$(lsno)这种命令也是利用标准输出流;而一条命令的正常输出是从FD1出来,而错误输出是从FD2出来;只不过刚开始时FD1恰好与标准输出流对接,而FD2恰好与标准错误流对接。7.任何一条外部命令都需要建立一个子shell,例如lsyes1>&2;lsno2>&1;这两条命令之间没有任何联系,它们运行时各自建

5、立的子shell的PID肯定是不同的。8.可以把若干条语句放到()中组成一个nestedsub-shell(内嵌的子shell),这样就会使得()中的语句执行后的各个流汇总到一起集中处理了,例如(lsyes;lsno)2>&1,最后的2>&对()里面的两条语句相当于都是有效力的9.在<或者>的左侧写FD号,在右侧写&加FD号,但需要强调一点是,对于左侧不写FD号的情况,>默认左侧写了1,而<默认左侧写了0下面就来将一些例子,可以参考《I/O重定向详解及应用实例》。首先来说一下我自己理解的有关FD的模型,只有在一条命令里(也就是同一个shell里)才可能有流的各种

6、定向问题,例如exec2>&3;ls2>&1;catfile1>&3;这几条语句之间没有任何关系;而lsno2>&11>&33>&2就有关系了,最终导致FD2和FD3均指向了标准输出口,而FD1指向了3口(这里我将各个口依次命名为:标准输入口,标准输出口,错误输出口,3口,4口,5口等等)。说的通俗一点,就是大家头脑中一定要有一个各类水管(FD1、FD2、FD3等等)与各个口对接的模型,只有理解了这一点才能得心应手的玩弄各个流于股掌之间。此外,2>&1的意思是各个口是永远不变的,也就是它们固定,这种操作能影响的仅仅是FD指向谁的问题,含义就是FD2指向FD1所指

7、的那个口,各个FD在没有乱指之前都指向自己对应的口。下面就一些例子来分析一下:exec3>&1;exec4>&1;((lsyesno2>&11>&33>&-;echo'bacoo'>&4)3>&1

8、egrep*>file)4>&1

9、grepba;echo$?;catfile;exec3>&-;exec4>&-;运行结果:bacoo0ls:无法访问no:没有该文件或目录yes打开FD3和FD4;FD2指向1口,FD1指向3口,FD3关闭;向4口输出bacoo,从这个括号里流出来三股流(ls的输出流,ls的错误流,echo的输出流),由于该三股流还不能直接和硬件打

10、交道,还得受制于外界对它们的影响,因此这里就不再表现为三股流从哪个口出来,取而代之的是表现为用FD几输出什么东西,对这三股流的统一操作是让其FD3指向1口,这下才彻底定下来了那三股流最后从哪个口出来。exec6<>file;以输入输出方式打开文件file,而且是通过6号通道。echo"hello">&6;echo"world!">&6;read-u6x;echo$x;#不过这里读不出东西来,因为当前文件指针是在file即将要写入数据的地方,也就是在world!行的下一行,因此读出的是空白,加入file已经有了内容,第一行是aaa,第二行是bbb,那么你再exec

11、6<>file;read

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。