Exporter 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 fonction intégrée printf
au lieu de l'externe seq
:
printf "n%04g\n" {1..100} | xargs -n 1 -P 10 -I {} bash -c 'echo_var "$@"' _ {}
De même, l'utilisation de return 0
y exit 0
comme cela masque toute valeur d'erreur qui pourrait être produite par la commande qui la précède. De plus, s'il n'y a pas d'erreur, c'est la valeur par défaut et donc quelque peu redondante.
@phobic mentionne que la commande Bash pourrait être simplifié en
bash -c 'echo_var "{}"'
en déplaçant le {}
directement à l'intérieur. Mais es vulnérable à l'injection de commandes comme l'a souligné @Sasha.
Voici un exemple de pourquoi vous ne doit pas utiliser le format intégré :
$ echo '$(date)' | xargs -I {} bash -c 'echo_var "{}"'
Sun Aug 18 11:56:45 CDT 2019
Un autre exemple de pourquoi pas :
echo '\"; date\"' | xargs -I {} bash -c 'echo_var "{}"'
Voici ce qui est produit utiliser le format sûr :
$ echo '$(date)' | xargs -I {} bash -c 'echo_var "$@"' _ {}
$(date)
C'est comparable à l'utilisation de paramétré SQL demandes de renseignements pour éviter injection .
J'utilise date
dans une substitution de commande ou entre guillemets ici au lieu de l'option rm
utilisée dans le commentaire de Sasha car elle est non-destructive.
2 votes
Danger, utilisateur1148366, Danger ! N'utilisez pas bash pour la programmation parallèle - vous rencontrerez tellement de problèmes. Utilisez C/C++ et pthreads, ou Java threads, ou n'importe quoi qui vous fasse réfléchir longuement et sérieusement à ce que vous faites, parce que la programmation parallèle demande beaucoup de réflexion pour être correcte.
29 votes
@DavidSouther Si les tâches sont indépendantes, comme convertir tous ces fichiers d'images en png, alors ne vous inquiétez pas. C'est lorsqu'il y a synchronisation (au-delà de l'attente de la fin de toutes les tâches) et communication que les choses se gâtent.
1 votes
@DavidSouther - Je suis un développeur Java de longue date et je travaille en groovy depuis peu. Et je continue à le dire aux gens : Les amis ne laissent pas leurs amis écrire des bash script. Et pourtant, je me retrouve à regarder ce post/solution parce que (visage triste :( ) je suis engagé dans le traitement parallèle dans bash. Je pourrais facilement le faire en groovy/java. Mauvais !
0 votes
Également abordé dans unix.stackexchange.com/questions/158564/