Chiamare le funzioni della shell con xargs

Sto cercando di usare xargs per chiamare una funzione più complessa in parallelo.

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

Questo restituisce l’errore

 xargs: echo_var: No such file or directory 

Qualche idea su come posso usare xargs per realizzare questo, o qualsiasi altra soluzione (s) sarebbe il benvenuto.

Esportare la funzione dovrebbe farlo (non testato):

 export -f echo_var seq -f "n%04g" 1 100 | xargs -n 1 -P 10 -I {} bash -c 'echo_var "[email protected]"' _ {} 

Puoi usare il builtin printf invece del seq esterno:

 printf "n%04g\n" {1..100} | xargs -n 1 -P 10 -I {} bash -c 'echo_var "[email protected]"' _ {} 

Inoltre, utilizzando return 0 e exit 0 come tale maschera qualsiasi valore di errore che potrebbe essere prodotto dal comando che lo precede. Inoltre, se non ci sono errori, è il default e quindi un po ‘ridondante.

L’uso di GNU Parallel è simile a questo:

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

Se si utilizza la versione 20170822 non è nemmeno necessario export -f finché si esegue questo:

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

Qualcosa di simile dovrebbe funzionare anche:

 function testing() { sleep $1 ; } echo {1..10} | xargs -n 1 | xargs [email protected] -P4 bash -c "$(declare -f testing) ; testing @ ; echo @ " 

Forse questa è una ctriggers pratica, ma se tu definisci le funzioni in un .bashrc o in un altro script, puoi racchiudere il file o almeno le definizioni di funzione con un’impostazione di 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