Linux 多个(带有一个固定的)GNU并行参数
我使用GNU parallel反复调用函数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
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[@]}"