gpt4 book ai didi

bash - 更多coproc问题

转载 作者:行者123 更新时间:2023-11-29 09:10:41 26 4
gpt4 key购买 nike

这是 bash coproc and leftover coproc output 的跟进

我最终决定一次处理一个文件的习惯用法是:

coproc cat auto/etc/build.cfg
while read -u ${COPROC[0]} BRANCH TARGET SVNSRC SVNTAG BUILDTYPE DISTTYPE DISTARGS
do
... commands ...
done

我知道对于 cat 的简单情况,我可以只使用输入重定向。这是一个简化版本,真正的版本使用 egrep 选择行的子集。

不幸的是,这不起作用。

$ cat test.sh
coproc cat auto/etc/build.cfg
while read -u ${COPROC[0]} BRANCH TARGET SVNSRC SVNTAG BUILDTYPE DISTTYPE DISTARGS
do
echo hello
done

$ bash -x test.sh
+ read -u 63 BRANCH TARGET SVNSRC SVNTAG BUILDTYPE DISTTYPE DISTARGS
+ cat auto/etc/build.cfg
+ echo hello
hello
+ read -u BRANCH TARGET SVNSRC SVNTAG BUILDTYPE DISTTYPE DISTARGS
test.sh: line 2: read: BRANCH: invalid file descriptor specification

看起来,即使文件中有 4 行,到第二次迭代时,协进程已经消失,连同它的文件描述符和 ${COPROC[*]} 变量已取消设置(请注意第二次读取中缺少的 fd)。

使事情复杂化的是,我同时在 Cygwin 和 Linux (Fedora) 中工作,这在这两种环境中表现出略有不同的行为。在 Linux 中,我得到了上述行为。在 Cygwin 中,一些命令(即 echo,它是 bash 内置命令)不会导致此问题。在这两种环境中,运行任何外部命令都会终止协进程并丢弃其描述符。

我猜这里真正的问题是:

在bash中,我如何完成

while read (list of vars) from file
do
one or more commands
done

配置文件很短,所以如果我必须将整个文件加载到一个数组中,那也行。

我真的很惊讶这在 bash 中如此困难。

最佳答案

我不确定为什么您对 coproc 的使用不起作用。您的示例适用于 Mac OS X 上的 bash 4.2.8。也许某些版本的 bash 在这里有问题。

听起来您可以从进程替换而不是使用协进程重定向。

while read foo bar baz quux; do
: use foo, bar, baz, quux in various commands
done < <(commands | that | generate --your lines-to-read)

当您的输入还没有在您可以使用普通重定向的简单文件中时,这会很方便。


如果您想坚持使用 coproc,您可以使用替代公式:

coproc { commands | that | generate --your lines-to-read ; }
while read foo bar baz quux; do
: use foo, bar, baz, quux in various commands
done <&${COPROC[0]}

关于bash - 更多coproc问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7682196/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com