Na vyvolanie funkcie používam GNU-parallel foo
opakovane. Funkcia má dva argumenty, názov súboru (a
v nižšie uvedenom príklade, uložené v poli A
) a rad filtrov (B
nižšie, s b
ako prvky B
).
Táto funkcia by mala prechádzať na všetky kombinácie A
a B
, ale úlovok je, že skutočne používam paralelu len na opakovanie A
, zatiaľ čo poskytuje B
na každé volanie funkcie.
Ako minimálny príklad:
#!/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 = %sn" $a $b
done
echo "-----------------"
}
export -f foo
# goal:
echo "Sequential (aka, the target) ==="
for a in "${A[@]}"; do
foo $a $B
done
výsledok
Sequential (aka, the target) ===
a = 1; b = X
a = 1; b = Y
-----------------
a = 2; b = X
a = 2; b = Y
-----------------
Pamätajte, že namiesto toho, aby sme mali jednotnú výzvu pre každú kombináciu, máme len pre každého A
hovor a potom v rámci funkcie iteračné B
.
Paralelné pokusy:
Skúste 1
parallel foo ::: "${A[@]}" ::: "${B}"
Výsledky v
a = 1; b = X
-----------------
a = 2; b = X
-----------------
(chýba druhý argument z B)
Skúste 2
parallel foo ::: "${A[@]}" ::: "${B[@]}"
Výsledky v
a = 1; b = X
-----------------
a = 1; b = Y
-----------------
a = 2; b = X
-----------------
a = 2; b = Y
-----------------
(jedno hovory na kombináciu, nie jeden hovor na A, potom iteráciu nad B)
Pozrel som sa do manuálu a SO, ale nebolo možné nájsť riešenie.
Mám pocit, že by to malo fungovať, keď exportujem pole B priamo, ale nemám žiadne výsledky
foo2() {
a=$1 # a single element of A
# B=$2 # the whole array B
for b in "${B[@]}"; do
printf "a = %s; b = %sn" $a $b
done
echo "-----------------"
}
export -f foo2
export B
parallel foo ::: "${A[@]}"
Výsledky v
-----------------
-----------------
(zrejme prázdne B)
odpovede:
1 pre odpoveď č. 1Váš problém pochádza z B
je pole. Nikdy som nevidel pole, ktoré bolo prenesené ako argument na funkciu predtým, a nie som si istý, či sa to dá urobiť.
Druhým problémom je, že zatiaľ čo môžete exportovať funkcie aj premenné, nemôžete exportovať pole bez podvodu: Exportovanie poľa v bash skripte
GNU Parallel umožňuje ľahko podvádzať pomocou env_parallel
, Týmto sa exportuje celé prostredie do shellu spusteného príkazom: Polia, premenné, aliasy a funkcie. To bude robiť aj pri spustení príkazov na diaľku.
env_parallel
sa veľmi zlepšila v uplynulom roku, takže upgrade, ak verzia, ktorú spôsobuje problémy.
#!/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 = %sn" $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[@]}"