web-dev-qa-db-fra.com

Appel de fonctions Shell avec xargs

J'essaie d'utiliser xargs pour appeler une fonction plus complexe en parallèle. 

#!/bin/bash
echo_var(){
    echo $1
    return 0
}
seq -f "n%04g" 1 100 |xargs -n 1 -P 10 -i echo_var {} 
exit 0

Cela renvoie l'erreur

xargs: echo_var: No such file or directory

Toute idée sur la manière dont je peux utiliser xargs pour y parvenir ou toute autre solution serait la bienvenue.

126
fac3

L'exportation de la fonction devrait le faire (non testé):

export -f echo_var
seq -f "n%04g" 1 100 | xargs -n 1 -P 10 -I {} bash -c 'echo_var "$@"' _ {}

Vous pouvez utiliser la variable intégrée printf au lieu de la variable externe seq:

printf "n%04g\n" {1..100} | xargs -n 1 -P 10 -I {} bash -c 'echo_var "$@"' _ {}

De même, utiliser return 0 et exit 0 comme cela masque toute valeur d'erreur pouvant être générée par la commande précédente. De plus, s’il n’ya pas d’erreur, c’est la valeur par défaut et donc quelque peu redondante.

126
Dennis Williamson

Utiliser GNU Parallel est semblable à ceci:

#!/bin/bash
echo_var(){
    echo $1
    return 0
}
export -f echo_var
seq -f "n%04g" 1 100 | parallel -P 10 echo_var {} 
exit 0

Si vous utilisez la version 20170822, vous n'avez même pas besoin de export -f tant que vous avez exécuté ceci:

. `which env_parallel.bash`
seq -f "n%04g" 1 100 | env_parallel -P 10 echo_var {} 
17
Ole Tange

Quelque chose comme ça devrait marcher aussi: 

function testing() { sleep $1 ; }
echo {1..10} | xargs -n 1 | xargs -I@ -P4 bash -c "$(declare -f testing) ; testing @ ; echo @ "
7
Eremite

C’est peut-être une mauvaise pratique, mais si vous définissez des fonctions dans un .bashrc ou un autre script, vous pouvez envelopper le fichier ou au moins les définitions de fonction avec le paramètre allexport:

set -o allexport

function funcy_town {
  echo 'this is a function'
}
function func_rock {
  echo 'this is a function, but different'
}
function cyber_func {
  echo 'this function does important things'
}
function the_man_from_funcle {
  echo 'not gonna lie'
}
function funcle_wiggly {
  echo 'at this point I\'m doing it for the funny names'
}
function extreme_function {
  echo 'goodbye'
}

set +o allexport
0
xdhmoore