/ / Multiple (avec un fixe) arguments GNU-parallel - linux, bash, traitement en parallèle, gnu-parallel

Plusieurs (avec un fixe) arguments parallèles GNU - linux, bash, traitement en parallèle, gnu-parallèle

J'utilise GNU-parallel pour appeler une fonction foo à plusieurs reprises. La fonction prend deux arguments, un nom de fichier (a dans l'exemple ci-dessous, enregistré dans le tableau A) et un tableau de filtres (B ci-dessous, avec b comme éléments de B).

La fonction doit parcourir toutes les combinaisons de A et Bcependant, le piège est que j’utilise en fait parallèle uniquement pour itérer sur A, tout en fournissant B à chaque appel de fonction.

À titre d'exemple minimum:

#!/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

Résultats

Sequential (aka, the target) ===
a = 1; b = X
a = 1; b = Y
-----------------
a = 2; b = X
a = 2; b = Y
-----------------

Attention, au lieu d’avoir un seul appel pour chaque combinaison, nous n’avons que pour chaque A un appel et ensuite dans la fonction itérer sur B.

Essais parallèles:

Essayer 1

parallel foo ::: "${A[@]}" ::: "${B}"

Résulte en

a = 1; b = X
-----------------
a = 2; b = X
-----------------

(manque le second argument de B)

Essayez 2

parallel foo ::: "${A[@]}" ::: "${B[@]}"

Résulte en

a = 1; b = X
-----------------
a = 1; b = Y
-----------------
a = 2; b = X
-----------------
a = 2; b = Y
-----------------

(un appel par combinaison, pas un appel par A, puis itération sur B)

J'ai jeté un coup d’œil au manuel et au manuel mais j’ai trouvé une solution

J'ai l'impression que cela devrait fonctionner lorsque j'exporte le tableau B directement, mais je n'obtiens aucun résultat.

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

Résulte en

-----------------
-----------------

(apparemment vide B)

Réponses:

1 pour la réponse № 1

Votre problème provient de B être un tableau. Je n'ai jamais vu un tableau passé en argument à une fonction, et je ne suis pas sûr que cela puisse être fait.

Le deuxième problème est que, même si vous pouvez exporter des fonctions et des variables, vous ne pouvez pas exporter un tableau sans tricher: Exportation d'un tableau en script bash

GNU Parallel facilite la triche en utilisant env_parallel. Cela exportera l'environnement complet vers le shell exécutant la commande: Tableaux, variables, alias et fonctions. Il le fera même lors de l'exécution de commandes à distance.

env_parallel L’année écoulée s’est beaucoup améliorée, alors mettez à niveau si la version que vous possédez pose problème

#!/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[@]}"