是coproc与&?

是coproc与&?

我读过这与在子 shell 进程中执行的$coproc < command >不同。$< command > &coproccommand

但当我测试它时,它的工作原理就像$< command > &.测试如下:

第一:测试 的行为$< command > &

  1. 运行$nano &终端1
  2. 在另一个 tty 上,输出$ps -t tty1 --forest表明 nano 进程是 -bash 进程的子进程(登录 bash shell 进程 -> 未创建子 shell 进程)

第二:测试行为$coproc < command >

  1. 运行$coproc nano终端1
  2. 在另一个 tty 上,输出$ps -t tty1 --forest与上面相同(没有创建子 shell 进程)

那么$coproc < command >就和一样吗$< command > &

使用的外壳是bash shell

答案1

coproc utilityutility &与中的不一样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选项,使其与协进程(以 开头的进程)通信,而不是使用一些显式的文件描述符。printread|&

答案2

区别在于创建了两个 I/O 通道,如下所述man bash

协进程在子 shell 中异步执行,就好像命令已使用 & 控制运算符终止,并在执行 shell 和协进程之间建立了双向管道。

相关内容