如何使用GNU parallel并行执行变量中的Shell命令列表?
用GNU Parallel实现并行执行数组中的Shell命令
正确实现方式
假设prog是存储Shell命令字符串的bash数组,要并行执行prog[1]到prog[10],可以直接用GNU Parallel遍历索引并执行对应命令:
parallel --env prog eval '${prog[{}]}' ::: {1..10}
说明:
--env prog:告诉Parallel将当前Shell的prog数组传递给子进程,确保子进程能访问到这个数组。{}:是Parallel的占位符,会被:::后面的每个索引值(1到10)替换。eval '${prog[{}]}':根据索引取出数组中的命令字符串并执行。
如果你的Shell环境默认能让子进程继承数组变量,也可以简化为:
parallel eval '${prog[{}]}' ::: {1..10}
错误写法分析
管道写法逻辑错误:
你尝试的parallel ::: seq 1 10 | { read -d '' x; eval "${prog[$x]}"; }存在两处问题::::后应直接跟参数列表,seq 1 10是命令,需改为::: $(seq 1 10)或直接写{1..10}。- Parallel的输出是换行分隔而非空分隔,
read -d ''无法读取正确内容,且这种管道方式无法让Parallel控制并行执行流程。
串行执行的根源:
你写的parallel ::: $(for i in {1..2}; do eval ${prog[$i]}; done)中,$(...)会先在当前Shell串行执行所有eval ${prog[$i]},把命令的输出结果作为Parallel的参数,Parallel仅处理这些输出内容,并未并行执行原命令,因此达不到预期效果。
内容的提问来源于stack exchange,提问作者Sina
相关产品推荐
相关产品推荐

