Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 多个(带有一个固定的)GNU并行参数_Linux_Bash_Parallel Processing_Gnu Parallel - Fatal编程技术网

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

Linux 多个(带有一个固定的)GNU并行参数,linux,bash,parallel-processing,gnu-parallel,Linux,Bash,Parallel Processing,Gnu Parallel,我使用GNU parallel反复调用函数foo。该函数接受两个参数,一个文件名(a,在下面的示例中,保存在数组a)和一个过滤器数组(B,下面的B作为B的元素) 函数应该迭代A和B的所有组合,但是,问题是,我实际上只使用parallel来迭代A,同时为每个函数调用提供B 作为最起码的例子: #!/bin/bash A=("1" "2" ) B=("X" "Y") foo() { a=$1 # a single element of A B=$2 # the whole arr

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

函数应该迭代
A
B
的所有组合,但是,问题是,我实际上只使用parallel来迭代
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
a调用,然后在函数中迭代
B

并行尝试: 试试1 导致

a = 1; b = X
-----------------
a = 2; b = X
-----------------
a = 1; b = X
-----------------
a = 1; b = Y
-----------------
a = 2; b = X
-----------------
a = 2; b = Y
-----------------
-----------------
-----------------
(缺少B的第二个参数)

试试2 导致

a = 1; b = X
-----------------
a = 2; b = X
-----------------
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[@]}"
导致

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

(显然是空的B)

您的问题源于
B
是一个数组。我以前从未见过数组作为参数传递给函数,我也不确定它是否可以实现

第二个问题是,虽然可以同时导出函数和变量,但如果不进行欺骗,就无法导出数组:

GNU Parallel通过使用
env_Parallel
使作弊变得容易。这将把整个环境导出到运行命令的shell:数组、变量、别名和函数。它甚至在远程运行命令时也会这样做

env_parallel
在过去的一年中有了很大的改进,因此如果您的版本出现问题,请升级

#!/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 "-----------------"
}

# If you have earlier run 'env_parallel --install'                                 
# to activate env_parallel in your shell                                           
# this should work.                                                                
env_parallel foo ::: "${A[@]}"

# If you have not, then this should work:
. `which env_parallel.bash`
env_parallel foo ::: "${A[@]}"