我有一个 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 )
但它并没有同时这样做。
虽然不完全令人满意,但我最终得到了以下解决方案:
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,因为我之前尝试过,所以这是一些加分)。
您正在寻找:
parallel ::: "${prog[@]}"