这是后续bash coproc 和剩余的 coproc 输出 https://stackoverflow.com/questions/7651946
我最终决定一次一行处理文件的习惯用法是:
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
不管用。你的例子对我有用bashMac OS X 上的 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]}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)