gpt4 book ai didi

bash coproc 和剩余的 coproc 输出

转载 作者:行者123 更新时间:2023-11-29 08:51:44 26 4
gpt4 key购买 nike

我需要在 bash 脚本中将一些配置数据读入环境变量。

“明显”(但不正确)的模式是:

egrep "pattern" config-file.cfg | read VAR1 VAR2 VAR3 etc...

这会失败,因为 read 在子 shell 中运行,因此无法在调用 shell 中设置变量。所以我想出了这个作为替代方案

coproc egrep "pattern" config-file.cfg
read -u ${COPROC[0]} VAR1 VAR2 VAR3 etc...

效果很好。

为了测试协进程返回多行时会发生什么,我尝试了这个:

coproc cat config-file.cfg
read -u ${COPROC[0]} VAR1 VAR2 VAR3 etc...

其中 config-file.cfg 包含三行。

$ cat config-file.cfg
LINE1 A1 B1 C1
LINE2 A2 B2 C2
LINE3 A3 B3 C3

我希望这能处理文件中的第一行,然后是某种“管道损坏”的错误消息。虽然它确实处理了第一行,但没有错误消息,也没有任何协进程在运行。

然后我在脚本中尝试了以下内容:

$ cat test.sh
coproc cat config-file.cfg
read -u ${COPROC[0]} VAR1 VAR2 VAR3 VAR4
echo $VAR1 $VAR2 $VAR3 $VAR4
wait
echo $?

运行它:

$ bash -x test.sh
+ read -u 63 VAR1 VAR2 VAR3 VAR4
+ cat config-file.cfg
LINE1 A1 B1 C1
+ wait
+ echo 0
0

剩下的两行去哪儿了?我本以为要么是“破损的管道”,要么是 wait 挂起,因为没有什么可以读取剩余的行,但正如您所看到的,返回代码为零。

最佳答案

根据上面的评论,您可以使用 process substitution实现这一目标。这样,read不在子 shell 中运行,捕获的变量将在当前 shell 中可用。

read VAR1 VAR2 VAR3 < <(egrep "pattern" config-file.cfg)

"If the <(list) form is used, the file passed as an argument should be read to obtain the output of list" -- what "file passed as an agrument" are they talking about?

这对我来说也很神秘。 chapter on process substitution在 Advanced Bash-scripting Guide 中有更全面的解释。

我的看法是,当 <(cmd)使用语法,cmd 的输出通过命名管道(或临时文件)提供,语法由管道/文件的文件名替换。所以对于上面的例子,它最终会等同于:

read VAR1 VAR2 VAR3 < /dev/fd/63

哪里/dev/fd/63是连接到 cmd 的标准输出的命名管道.

关于bash coproc 和剩余的 coproc 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7651946/

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