/ / Viacnásobné (s jedným pevným) paralelným argumentom GNU - linux, bash, paralelné spracovanie, gnu-paralelné

Viacero (s jedným pevným) paralelným argumentom GNU - linux, bash, paralelné spracovanie, gnu-paralelné

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ď č. 1

Váš 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[@]}"