我已经读到,$coproc < command >与$< command > &不同,因为coproc将在子shell进程中执行command。
但是当我测试它的时候,它就像$< command > &一样工作。试验结果如下:
首先:测试$< command > &的行为。
$nano &上运行tty1$ps -t tty1 --forest的输出表明纳米进程是-bash进程的子进程(登录bash进程->没有创建子shell进程)。第二:测试$coproc < command >的行为
$coproc nano上运行tty1$ps -t tty1 --forest的输出与上面相同(没有创建子shell进程)。那么,$coproc < command >与$< command > &是完全相同的吗?
使用的shell是一个bash shell
发布于 2018-10-01 13:08:04
coproc utility与utility &在bash中是不一样的。
使用coproc utility,您可以得到一个数组COPROC,它包含utility的标准输入和输出文件压缩器。然后你可以做这样的事情
#!/bin/bash
coproc bc -l
for (( k = 0; k < 50; ++k )); do
printf '2.3*%d + 1\n' "$k" >&${COPROC[1]}
read -u "${COPROC[0]}" a
printf '%.2f\n' "$a"
done
kill "$COPROC_PID"在这里,bc -l是一个共同进程,它的作用类似于shell循环的“算术计算服务”,它使用表达式对其标准输入进行计算,并返回其标准输出的结果。
据我所知,bash在任何时候都只支持一个协同进程.
ksh93 shell也支持协同进程,但语法完全不同(但有点时髦)。这是等价的ksh93脚本:
#!/usr/bin/ksh93
bc -l |&
coproc_pid=$!
for (( k = 0; k < 50; ++k )); do
print -p -f '2.3*%d + 1\n' "$k"
read -p a
printf '%.2f\n' "$a"
done
kill "$coproc_pid"这里,是print和read的D14选项使它与协同进程(进程从|&开始)进行通信,而不是使用一些显式的文件复制器。
发布于 2018-10-01 12:20:20
区别在于创建两个I/O通道,如man bash中所述:
协同进程在子shell中异步执行,就像命令已经使用& control操作符终止一样,在执行的shell和协同进程之间建立了一个双向管道。
https://unix.stackexchange.com/questions/472561
复制相似问题