Bash:文件描述符

前端之家收集整理的这篇文章主要介绍了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似乎在“消耗”后得到“耗尽”,是否在首次使用后也自动关闭
> 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之后立即包含它.然而,似乎有一个中间的subshel​​l,你实际上得到了这个subshel​​l的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 <&-?

不,这两种语法都是为了一致性而提供的.

猜你在找的Bash相关文章