如何从工作中返回值?

如何从工作中返回值?

我想在脚本中启动一些作业来并行执行一些工作。我可以通过计算活动作业的数量来知道工作何时完成。我遇到的问题是,我还想从这些作业返回一个值,而不必暂时处理写入和读取。

在此示例中,您将看到我可以计算正在运行的作业的数量,但 的值a未更新为456

function _n_jobs() {
   echo $(jobs -r | wc -l | tr -d " ")
}

a=123

(
   sleep 2s
   a=456
) &

echo "Number of jobs: "$(_n_jobs)

while (( $(_n_jobs) > 0 )); do
   sleep 0.1s
done

echo $a

我发现我可以将子 shell 的输出写入文件描述符,以从并行运行的任务中获取值。但这是 subshel​​l 没有注册为作业。这意味着我无法知道一系列并行任务何时完成,因为我无法像计算作业那样对它们进行计数。

在此示例中,我可以通过将子 shell 的输出重定向到文件描述符来从子 shell 获取值,但作业数量为0

function _n_jobs() {
   echo $(jobs -r | wc -l | tr -d " ")
}

a=123

exec {fd}< <(
   sleep 2s
   echo 456
)

echo "Number of jobs: "$(_n_jobs)

read <&${fd} a

echo $a

有没有一种方法可以让我以这种方式从工作中返回值?

尽管我的示例返回数字,但读取退出代码还不够。我希望结果是任意的,这样我也可以返回一个字符串,这就是我使用文件描述符的原因。

相关内容