我需要在 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
挂起,因为没有什么可以读取剩余的行,但正如您所见,返回码为零。