Bash:文件描述符
我是一个
Bash初学者,但我试图学习这个工具,在这些日子里有一台电脑工作.
我现在正在教自己关于文件描述符.让我分享一下我的实验: #!/bin/bash # Some dummy multi-line content read -d '' colours <<- 'EOF' red green blue EOF # File descriptor 3 produces colours exec 3< <(echo "$colours") # File descriptor 4 filters colours exec 4> >(grep --color=never green) # File descriptor 5 is an unlimited supply of violet exec 5< <(yes violet) echo Reading colours from file descriptor 3... cat <&3 echo ... done. echo Reading colours from file descriptor 3 again... cat <&3 echo ... done. echo Filtering colours through file descriptor 4... echo "$colours" >&4 echo ... done. # Race condition? echo Dipping into some violet... head <&5 echo ... done. echo Dipping into some more violet... head <&5 echo ... done. 我看到上述的输出有一些问题, > fd3似乎在“消耗”后得到“耗尽”,是否在首次使用后也自动关闭? 谢谢! PS:部分(编号)的答案很好..我会把不同的部分自己放在一起(虽然一个人的综合答案会令人印象深刻!)
不,它没有关闭.这是由于exec的工作原理.在使用exec(不带参数)的模式下,它的功能是根据指定给自身的I / O重定向来安排shell自己的文件描述符,然后将它们保留,直到脚本终止或更改稍后再试. 之后,猫在其标准输入(文件描述符0)上收到该文件描述符3的副本.猫的标准输入在猫离开时隐含关闭(或者尽管不太可能,猫在它存在之前关闭,但这并不重要).该文件的原始副本,即shell的文件描述符3,仍然存在.虽然实际的文件已经达到EOF,但是没有任何进一步的读取.
shell的<(一些命令)语法(这不是标准的bourne shell语法,我相信只有在zsh和bash中可用)可能实际上可以使用命名管道实现.它可能不在Linux下,因为有一个更好的方法(使用/ dev / fd),但它可能在其他操作系统上. 所以在这个意义上说,这个语法可能是或可能不是设置命名管道的帮手.
<(是紫色)构造被评估(当评估执行exec 5<(是紫色)时发生)).
不,它不会停止.但是,当它开始产生更多的输出时,它将阻止足够的时间,而不是读取管道的另一端正在消耗的东西.换句话说,管道缓冲区将变满.
好问题! $!似乎在执行yes之后立即包含它.然而,似乎有一个中间的subshel??l,你实际上得到了这个subshel??l的pid.尝试<(exec yes violet)以避免中间过程.
不是从外壳.但是,如果您使用像/ proc这样的Linux操作系统,那么可以参考/ proc / self / fd.
为了避免这种情况,您可能想要等待grep进程完成,然后再继续执行脚本.如果您获得该进程的进程ID(如上所述),我认为您应该能够等待.
是.那么会发生什么呢,是的,将继续尝试产生输出永远,但是当文件描述符的另一端关闭时,它将获得写错误(EPIPE)或默认情况下致命的信号(SIGPIPE).
不,这两种语法都是为了一致性而提供的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |