是否可以有多个并发协进程?

kjo*_*kjo 4 scripting bash shell-script coprocesses

下面的测试脚本1目的是启动一个“外部”协进程(运行),在一个-loop 中从这个协进程中读取,并且对于读取的每一行,打印一行标识外部循环的当前迭代,启动一个“内部”协进程(也正在运行,带有新参数),在嵌套的 while 循环中从这个内部协进程读取,然后清理这个内部协进程。嵌套的 while 循环为它从内部协进程读取的每一行打印一些输出。seq 3whileseq

#!/bin/bash
# filename: coproctest.sh
PATH=/bin:/usr/bin

coproc OUTER { seq 3; }
SAVED_OUTER_PID="${OUTER_PID}"

exec {OUTER_READER}<&"${OUTER[0]}"
while IFS= read -r -u "${OUTER_READER}" OUTER_INDEX; do

    printf -- '%d\n' "${OUTER_INDEX}"

    START=$(( OUTER_INDEX * 1000000 ))
    FINISH=$(( START + OUTER_INDEX ))

    # (
      coproc INNER { seq "${START}" "${FINISH}"; }
      SAVED_INNER_PID="${INNER_PID}"
      exec {INNER_READER}<&"{INNER[0]}"

      while IFS= read -r -u "${INNER_READER}" INNER_INDEX; do
          printf -- '    %d\n' "${INNER_INDEX}"
      done

      exec {INNER_READER}<&-

      wait "${SAVED_INNER_PID}"
    # )

done
exec {OUTER_READER}<&-
wait "${SAVED_OUTER_PID}"
Run Code Online (Sandbox Code Playgroud)

当我运行这个脚本时,这是我得到的输出:

% ./coproctest.sh
1
./coproctest.sh: line 30: warning: execute_coproc: coproc [12523:OUTER] still exists
./coproctest.sh: line 19: INNER_READER: ambiguous redirect
./coproctest.sh: line 21: read: : invalid file descriptor specification
./coproctest.sh: line 25: INNER_READER: ambiguous redirect
2
./coproctest.sh: line 19: INNER_READER: ambiguous redirect
./coproctest.sh: line 21: read: : invalid file descriptor specification
./coproctest.sh: line 25: INNER_READER: ambiguous redirect
3
./coproctest.sh: line 19: INNER_READER: ambiguous redirect
./coproctest.sh: line 21: read: : invalid file descriptor specification
./coproctest.sh: line 25: INNER_READER: ambiguous redirect
Run Code Online (Sandbox Code Playgroud)

如果我取消注释两条注释行,我会得到几乎相同的输出。


Q1:是否可以同时运行多个协进程?

Q2:如果是这样,应该如何修改上面的脚本以达到所需的输出?


1我最近才开始使用协进程,还有很多我不明白的地方。因此,该脚本几乎肯定包含不正确、笨拙或不必要的代码。请随时评论和/或修复您回复中的这些弱点。

Kus*_*nda 5

bash手册最后的“BUGS”部分:

一次可能只有一个活动协进程。