将 shell 命令列表传递给 GNU parallel

问题描述 投票:0回答:2

我有一个 shell 命令列表,作为字符串存储在变量 prog 中,目前我通过并行执行它们

for I in 1 10; do 
  eval "${prog[$I]}"& 
done
wait

如何使用 GNU parallel 获得相同的结果?我尝试通过管道 seq 1 10

parallel ::: seq 1 10 | { read -d '' x; eval "${prog[$x]}"; }

但我什至无法超越并行工作 ::: 很明显我做错了。

一个旁注我设法让以下运行

parallel ::: $(  for i in {1..2}; do eval ${prog[$i]}; done )

但它并没有同时这样做。

shell gnu-parallel
2个回答
0
投票

虽然不完全令人满意,但我最终得到了以下解决方案:

arg1="5"
arg2="some option"

run_parallel(){
  some_executable $1 $2 $3
}
export -f run_parallel

seq 1 50|
   parallel --pipe -N1 --jobs 10 'read I; run_parallel $I '"$arg1"' '"$arg2"';' 

我并不完全满意,因为我刚刚发现我不能将进度条与 --pipe 一起使用,而且我不知道如何使用管道来做到这一点。所以如果有人知道请告诉我。另外,如果不像上面那样组合双和单 quites,我也想不出一种方法来做到这一点,所以这看起来也有点奇怪。当我通过 shell 检查它时,它说例如

(info): Expressions don't expand in single quotes, use double quotes for that.

尽管如此,它仍然有效,并在可执行文件中产生了带有正确参数的预期结果,所以它仍然是一个解决方案(并且它避免使用 eval,因为我之前尝试过,所以这是一些加分)。


0
投票

您正在寻找:

parallel ::: "${prog[@]}"
© www.soinside.com 2019 - 2024. All rights reserved.