我读过这与在子 shell 进程中执行的$coproc < command >
不同。$< command > &
coproc
command
但当我测试它时,它的工作原理就像$< command > &
.测试如下:
第一:测试 的行为$< command > &
。
- 运行
$nano &
终端1 - 在另一个 tty 上,输出
$ps -t tty1 --forest
表明 nano 进程是 -bash 进程的子进程(登录 bash shell 进程 -> 未创建子 shell 进程)
第二:测试行为$coproc < command >
- 运行
$coproc nano
终端1 - 在另一个 tty 上,输出
$ps -t tty1 --forest
与上面相同(没有创建子 shell 进程)
那么$coproc < command >
就和一样吗$< command > &
?
使用的外壳是bash shell
答案1
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
也只支持一随时进行协同处理。
shellksh93
还支持协同进程,但语法完全不同(但更时尚)。这是等效的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"
在这里,它是和的-p
选项,使其与协进程(以 开头的进程)通信,而不是使用一些显式的文件描述符。print
read
|&
答案2
区别在于创建了两个 I/O 通道,如下所述man bash
:
协进程在子 shell 中异步执行,就好像命令已使用 & 控制运算符终止,并在执行 shell 和协进程之间建立了双向管道。