多个(有一个固定的)GNU并行参数

时间:2018-01-15 22:20:13

标签: linux bash parallel-processing gnu-parallel

我使用GNU-parallel重复调用函数foo。该函数有两个参数,一个文件名(下例中的a,保存在数组A中)和一个过滤器数组(B下面,b作为元素B)。

该函数应该迭代AB的所有组合,但是,实际上,我实际上只使用并行来迭代A,同时提供B每个函数调用。

作为最低限度的例子:

#!/bin/bash

A=("1" "2" )
B=("X" "Y")

foo() {
    a=$1 # a single element of A
    B=$2 # the whole array B
    for b in "${B[@]}"; do
        printf "a = %s; b = %s\n" $a $b
    done
    echo "-----------------"
}
export -f foo

# goal:
echo "Sequential (aka, the target) ==="
for a in "${A[@]}"; do
    foo $a $B
done

结果

Sequential (aka, the target) ===
a = 1; b = X
a = 1; b = Y
-----------------
a = 2; b = X
a = 2; b = Y
-----------------

请注意,我们不是只对每个组合进行一次调用,而是只为每个A调用,然后在函数内迭代B

并行尝试:

尝试1

parallel foo ::: "${A[@]}" ::: "${B}"

结果

a = 1; b = X
-----------------
a = 2; b = X
-----------------

(缺少B的第二个参数)

尝试2

parallel foo ::: "${A[@]}" ::: "${B[@]}" 

结果

a = 1; b = X
-----------------
a = 1; b = Y
-----------------
a = 2; b = X
-----------------
a = 2; b = Y
-----------------

(每个组合一次呼叫,而不是每个A呼叫一次,然后迭代B)

我仔细阅读了手册,但是找不到解决方案。

修改

我觉得直接导出数组B时它应该可以工作,但是也没有结果

foo2() {
    a=$1 # a single element of A
    # B=$2 # the whole array B
    for b in "${B[@]}"; do
        printf "a = %s; b = %s\n" $a $b
    done
    echo "-----------------"
}
export -f foo2
export B

parallel foo ::: "${A[@]}"

结果

-----------------
-----------------

(显然是空的B)

1 个答案:

答案 0 :(得分:2)

您的问题源于 let state = this.props.location.state state = { currentItem: state && state.currentItem ? state.currentItem : 0 } 是一个数组。我以前从未见过将数组作为参数传递给函数,我不确定是否可以完成。

第二个问题是虽然你可以导出函数和变量,但是你不能在不作弊的情况下导出数组:Exporting an array in bash script

GNU Parallel使用B可以轻松作弊。这会将完整环境导出到运行命令的shell:数组,变量,别名和函数。在远程运行命令时甚至会这样做。

env_parallel在过去的一年里有了很大的改进,所以如果你的版本有问题就升级。

env_parallel