我想在脚本中启动一些作业来并行执行一些工作。我可以通过计算活动作业的数量来知道工作何时完成。我遇到的问题是,我还想从这些作业返回一个值,而不必暂时处理写入和读取。
在此示例中,您将看到我可以计算正在运行的作业的数量,但 的值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 的输出写入文件描述符,以从并行运行的任务中获取值。但这是 subshell 没有注册为作业。这意味着我无法知道一系列并行任务何时完成,因为我无法像计算作业那样对它们进行计数。
在此示例中,我可以通过将子 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
有没有一种方法可以让我以这种方式从工作中返回值?
尽管我的示例返回数字,但读取退出代码还不够。我希望结果是任意的,这样我也可以返回一个字符串,这就是我使用文件描述符的原因。