#!/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似乎在“消耗”后得到“耗尽”,是否在首次使用后也自动关闭?
> fd3如何与命名管道不同? (我已经看过的东西)
>当命令何时完成开始执行?在fd申报?后来?
>是是停止(CTRL-Z或其他),并在需要更多的紫罗兰时重启?
>如何获得PID的PID?
>我可以得到“活动”fds的列表吗?
>通过fd4过滤非常有趣的比赛条件,可以避免吗?
>只有当我执行5>& – ?
我是否关闭了>& – 或<& - ?
现在我会停在这里.
谢谢!
PS:部分(编号)的答案很好..我会把不同的部分自己放在一起(虽然一个人的综合答案会令人印象深刻!)
fd3 seems to get “depleted” after “consumption”,is it also automatically closed after first use?
不,它没有关闭.这是由于exec的工作原理.在使用exec(不带参数)的模式下,它的功能是根据指定给自身的I / O重定向来安排shell自己的文件描述符,然后将它们保留,直到脚本终止或更改稍后再试.
之后,猫在其标准输入(文件描述符0)上收到该文件描述符3的副本.猫的标准输入在猫离开时隐含关闭(或者尽管不太可能,猫在它存在之前关闭,但这并不重要).该文件的原始副本,即shell的文件描述符3,仍然存在.虽然实际的文件已经达到EOF,但是没有任何进一步的读取.
how is fd3 different from a named pipe? (something I have looked at already)
shell的<(一些命令)语法(这不是标准的bourne shell语法,我相信只有在zsh和bash中可用)可能实际上可以使用命名管道实现.它可能不在Linux下,因为有一个更好的方法(使用/ dev / fd),但它可能在其他操作系统上. 所以在这个意义上说,这个语法可能是或可能不是设置命名管道的帮手.
when exactly does the command yes start executing? upon fd declaration? later?
<(是紫色)构造被评估(当评估执行exec 5<(是紫色)时发生)).
does yes stop (CTRL-Z or other) and restart when more violet is needed?
不,它不会停止.但是,当它开始产生更多的输出时,它将阻止足够的时间,而不是读取管道的另一端正在消耗的东西.换句话说,管道缓冲区将变满.
how can I get the PID of yes?
好问题! $!似乎在执行yes之后立即包含它.然而,似乎有一个中间的subshell,你实际上得到了这个subshell的pid.尝试<(exec yes violet)以避免中间过程.
can I get a list of “active” fds?
不是从外壳.但是,如果您使用像/ proc这样的Linux操作系统,那么可以参考/ proc / self / fd.
very interesting race condition on filtering through fd4,can it be avoided?
为了避免这种情况,您可能想要等待grep进程完成,然后再继续执行脚本.如果您获得该进程的进程ID(如上所述),我认为您应该能够等待.
will yes only stop when I exec 5>&-?
是.那么会发生什么呢,是的,将继续尝试产生输出永远,但是当文件描述符的另一端关闭时,它将获得写错误(EPIPE)或默认情况下致命的信号(SIGPIPE).
does it matter whether I close with >&- or <&-?
不,这两种语法都是为了一致性而提供的.