我使用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
。
parallel foo ::: "${A[@]}" ::: "${B}"
结果
a = 1; b = X
-----------------
a = 2; b = X
-----------------
(缺少B的第二个参数)
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)
答案 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