标签: coproc

bash coproc和剩余的coproc输出

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

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

egrep "pattern" config-file.cfg | read VAR1 VAR2 VAR3 etc...
Run Code Online (Sandbox Code Playgroud)

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

coproc egrep "pattern" config-file.cfg
read -u ${COPROC[0]} VAR1 VAR2 VAR3 etc...
Run Code Online (Sandbox Code Playgroud)

哪个工作正常.

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

coproc cat config-file.cfg
read -u ${COPROC[0]} VAR1 VAR2 VAR3 etc...
Run Code Online (Sandbox Code Playgroud)

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

$ cat config-file.cfg
LINE1 A1 B1 C1
LINE2 A2 B2 C2
LINE3 A3 B3 C3
Run Code Online (Sandbox Code Playgroud)

我希望这会处理文件中的第一行,然后是某种"破管"错误消息.虽然它确实处理了第一行,但没有任何错误消息,也没有任何协同进程继续运行.

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

$ cat test.sh
coproc cat config-file.cfg
read -u ${COPROC[0]} VAR1 VAR2 VAR3 VAR4
echo $VAR1 $VAR2 $VAR3 $VAR4
wait
echo $? …
Run Code Online (Sandbox Code Playgroud)

bash coproc

10
推荐指数
1
解决办法
3920
查看次数

如何使用'coproc'与另一个命令驱动程序进行交互

好吧,显然我不是一个bash guru而且我需要一个!

我之前从未使用过'coproc',但它似乎正是我所需要的.但是,我不得不承认我无法从那里的各种'ping'例子中推断出来![我确实尝试了几个小时...]

我想要做的就是启动一个'coproc'shell脚本,它可以从标准输入中获取输入,并将其结果写入标准输出.我希望主脚本分别发送和处理这些命令和结果.

这是我想要做的最简单的概述之一:用 更好的细节编辑

#! /bin/bash

coproc bkgndProc {
    /some/path/to/usefulScript.sh  maybeSomeArgsHere
}

// send command #1 to bkgndProc here
result=$(echo 'command' <&${bkgndProc[0]})    ### Doesn't work for me
echo "Did it work? $result"   ### this just prints back the 'command' I used

// here execute conditional logic based on result:
// if result1; then
//     send command #2 here, getting results
// else
//     send command #3 here, again getting results
// fi
Run Code Online (Sandbox Code Playgroud)

很抱歉使用上面的伪代码,但我不确定那些发送命令应该是什么!如果有人能提供非常感谢的细节!

bash coproc

7
推荐指数
1
解决办法
4264
查看次数

后台进程重定向到 COPROC

在下面的测试脚本中,我运行一个基本协进程echo,在后台运行的内置协进程附加其标准输出:

#!/bin/bash
# TEST 1
coproc /bin/sleep 100
echo >&${COPROC[1]} &
Run Code Online (Sandbox Code Playgroud)

该脚本总是失败,没有明显的原因,给出输出:

./test.sh: line 4: ${COPROC[1]}: Bad file descriptor
Run Code Online (Sandbox Code Playgroud)

我想知道正确的语法是否应该是这样的(&符号在重定向之前移动):

#!/bin/bash
# TEST 2
coproc /bin/sleep 100
echo & >&${COPROC[1]}
Run Code Online (Sandbox Code Playgroud)

第二个示例似乎有效,因为它在执行过程中没有报告任何错误,但使用此语法,实际上不会执行重定向;事实上,考虑另一个测试:

#!/bin/bash
# TEST 3
/bin/echo abc & >xfile
Run Code Online (Sandbox Code Playgroud)

测试 3 创建该文件xfile,但不向其中写入任何内容。奇怪的是,在重定向后再次尝试定位&符号可以使echo工作正常:

#!/bin/bash
# TEST 4
/bin/echo abc >xfile &
Run Code Online (Sandbox Code Playgroud)

xfile测试 4 创建包含字符串 的文件abc

了解导致coproc重定向错误的原因或正确的语法是什么?

bash ipc pipe io-redirection coproc

5
推荐指数
1
解决办法
2711
查看次数

更多coproc问题

这是bash coproc和剩余coproc输出的后续

我最终决定一次处理一行文件的成语是:

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

我知道简单的情况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 …
Run Code Online (Sandbox Code Playgroud)

bash coproc

4
推荐指数
1
解决办法
1685
查看次数

标签 统计

bash ×4

coproc ×4

io-redirection ×1

ipc ×1

pipe ×1