【发布时间】:2018-06-24 14:02:36
【问题描述】:
我使用 GNU-parallel 反复调用函数 foo。该函数有两个参数,一个文件名(在下面的示例中为a,保存在数组A 中)和一个过滤器数组(下面的B,b 作为B 的元素)。
该函数应该迭代 A 和 B 的所有组合,但是,问题是,我实际上只使用并行迭代 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)
我查看了手册和 SO,但找不到解决方案。
编辑
感觉直接导出数组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)
【问题讨论】:
标签: linux bash parallel-processing gnu-parallel