Linux管道学习.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Linux管道学习

Linux管道学习 知识点: 1. 管道左右的命令是并行执行的,而且是从右向左执行的,因此就需要在执行命令之前先对标准输出流及错误流等各种流进行分析,分析清楚了之后,也就相当于已经制定好了计划(打个比方,就相当于排水管道全部已经铺设完成,只等着各种水流来流动),然后并行启动程序,这里还要强调的是,这里的并行指的是“有依赖关系的并行”,反正大家不要理解成“必须前一条命令执行完毕,出来结果之后才能送给后续的命令接着处理”就可以了。 2. 基本的FD只有3个,即0、1、2,其他的需要手动开启,开启的方法是:exec [3到255之间的数][0到2之间的数];关闭的方法是:exec num-。 3. 还要很清楚子shell的概念,除了bash内建的那些指令之外,其他的指令都相当于先fork再exec,也就是用子shell来执行的,还有shell及其他各种脚本也都是在子shell中执行的(详情请参考《shell编程之shell问答录》)。子shell会继承父shell中已经打开的FD,注意子shell只会知道父shell中开启了哪些FD,但并不会知道父shell中的各个FD是怎样的一个关系,例如究竟是21了呢,还是12了呢,这些信息子shell都是不会知道的。 4. 查看当前打开了哪些FD,有两种方法:ls /proc/$$/fd或者lsof -p $$(观察最后几行即可) 5. 任何一个FD都是指向屏幕的(用ls -l /proc/$$/fd便可以看出它们指向的是同一个设备文件),至于谁是输入谁是输出,是由和决定的,和0、1、2没有关系 6. 管道|只接受标准输出流;屏幕回显使用得是标准错误流;s=$(ls no)这种命令也是利用标准输出流;而一条命令的正常输出是从FD1出来,而错误输出是从FD2出来;只不过刚开始时FD1恰好与标准输出流对接,而FD2恰好与标准错误流对接。 7. 任何一条外部命令都需要建立一个子shell,例如ls yes 12;ls no 21;这两条命令之间没有任何联系,它们运行时各自建立的子shell的PID肯定是不同的。 8. 可以把若干条语句放到()中组成一个nested sub-shell(内嵌的子shell),这样就会使得()中的语句执行后的各个流汇总到一起集中处理了,例如(ls yes; ls no) 21,最后的2对()里面的两条语句相当于都是有效力的 9. 在或者的左侧写FD号,在右侧写加FD号,但需要强调一点是,对于左侧不写FD号的情况,默认左侧写了1,而默认左侧写了0 下面就来将一些例子,可以参考《I/O重定向详解及应用实例》。 首先来说一下我自己理解的有关FD的模型,只有在一条命令里(也就是同一个shell里)才可能有流的各种定向问题,例如exec 23;ls 21;cat file 13;这几条语句之间没有任何关系;而ls no 21 13 32就有关系了,最终导致FD2和FD3均指向了标准输出口,而FD1指向了3口(这里我将各个口依次命名为:标准输入口,标准输出口,错误输出口,3口,4口,5口等等)。说的通俗一点,就是大家头脑中一定要有一个各类水管(FD1、FD2、FD3等等)与各个口对接的模型,只有理解了这一点才能得心应手的玩弄各个流于股掌之间。此外,21的意思是各个口是永远不变的,也就是它们固定,这种操作能影响的仅仅是FD指向谁的问题,含义就是FD2指向FD1所指的那个口,各个FD在没有乱指之前都指向自己对应的口。 下面就一些例子来分析一下: exec 31;exec 41;((ls yes no 21 13 3-;echo bacoo 4) 31 |egrep \* file) 41 | grep ba;echo $?;cat file;exec 3-;exec 4-; 运行结果: bacoo 0 ls: 无法访问no: 没有该文件或目录 yes 打开FD3和FD4;FD2指向1口,FD1指向3口,FD3关闭;向4口输出bacoo,从这个括号里流出来三股流(ls的输出流,ls的错误流,echo的输出流),由于该三股流还不能直接和硬件打交道,还得受制于外界对它们的影响,因此这里就不再表现为三股流从哪个口出来,取而代之的是表现为用FD几输出什么东西,对这三股流的统一操作是让其FD3指向1口,这下才彻底定下来了那三股流最后从哪个口出来。 exec 6 file; 以输入输出方式打开文件file,而且是通过6号通道。 echo hello 6; echo world! 6; read -u 6 x;echo $x;#不过这里读不出东西来,因为当前文件指针是在file即将要写入数据的地方,也就是在world!行的下一行,因此读出的是空白,加入file已经有了内容,第一行是aaa,第二行是b

文档评论(0)

wuyoujun92 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档