linux - 并行进程:将输出附加到 bash 脚本中的数组
问题描述
我有一个 for 循环,其中task
调用了一个函数。对函数的每次调用都会返回一个附加到数组的字符串。我想并行化这个 for 循环。我尝试使用&
,但它似乎不起作用。
这是未并行化的代码。
task (){ sleep 1;echo "hello $1"; }
arr=()
for i in {1..3}; do
arr+=("$(task $i)")
done
for i in "${arr[@]}"; do
echo "$i x";
done
输出是:
hello 1 x
hello 2 x
hello 3 x
伟大的!但是现在,当我尝试将它与
[...]
for i in {1..3}; do
arr+=("$(task $i)")&
done
wait
[...]
输出为空。
解决方案
GNU Parallel擅长并行处理 :-)
task (){ sleep 1;echo "hello $1"; }
# Make "task" known to sub shells
export -f task
# Do tasks in parallel
parallel -k task ::: {1..3}
样本输出
hello 1
hello 2
hello 3
我建议你这样做——但查尔斯好心地指出这是一个已知的bash
陷阱:
array=( $(parallel -k task ::: {1..3}) )
查尔斯建议的解决方案是:
IFS=$'\n' read -r -d '' -a array < <(parallel -k task ::: 1 2 3 && printf '\0')
推荐阅读
- javascript - 如何使用 react native 和 react navigation v5 设置背景图片?
- c# - Process.Start in C# The system cannot find the file specified error using a variable name
- r - R 不喜欢我的坐标 - st_as_sf()
- events - Blazor:绑定 OnChange 事件 - 可以使用 EventCallback.Factory.CreateBinder 吗?
- neo4j - Cypher:表示嵌套图?
- android - 如何使用来自视图的 setText 和值将字符串与 XML 字符串连接起来
- java - 有没有办法从静态类重新创建“父”类?
- firebase - firestore 在云功能教程中的模拟器中不起作用
- saxon - 捕获的累加器上的 id()
- linux - 检查文件是否在 Linux 上使用 Powershell 脚本签名