Bonjour,
je souhaite exécuter en parallèle dans un script zsh, avec GNU parallel, une fonction définit dans ce même script comme ceci
#!/bin/zsh
function func {
echo $1
}
export -f func
func "Hello"
ls . | parallel func
Hors cela ne fonctionne pas, j'obtiens comme message d'erreur "zsh:1: command not found: func". Il y a pourtant bien un export demandé dans la page man de GNU parallel.
Une idée ou une wizarderie ? Parce que j'ai bon chercher et essayer, rien ni fait et j'en suis triste…
Merci d'avance
# test mal choisie && || pb de syntaxe
Posté par ze_lionix (site web personnel) . Évalué à 2.
Je connaissais pas avant ( merci ), du coup j'ai un peu essayé.
Ce que tu cherches à faire se fait en une ligne :
Je ne pratique pas zsh mais
- soit tu t'es trompé de syntaxe
- soit ce n'est pas ton shell par défaut . Car j'ai remarqué que parallele utilise le shell par défaut !
Malgré le sheebang sur ton script je me prenais des "bash : func command not found".
Bref, chez moi, avec bash comme default shell j'ai ajusté la déclaration de fonction et ca roule
Fuse : j'en Use et Abuse !
# export de fonction
Posté par BFG . Évalué à 3. Dernière modification le 24 octobre 2012 à 21:19.
On ne peut exporter une fonction comme on exporte une variable d'environnement.
Ici, parallel semble tout de même invoquer un shell pour exécuter la commande en paramètre (alors qu'il aurait pu se contenter de le chercher dans le $PATH, ce qui n'aurait pas fonctionné non plus).
Vous pouvez soit mettre votre fonction dans un script séparé exécutable (et donc retirer l'enrobage "function func"), soit la placer dans un fichier de configuration du shell (.zshenv).
[^] # Re: export de fonction
Posté par Sytoka Modon (site web personnel) . Évalué à 2.
De tête, cela permet d'exporter une fonction vers un sous shell. Cela fonctionne avec bash. Je l'utilise de temps en temps.
Par contre, il n'est pas possible d'exporter les alias mais qui utilise encore les alias ;-)
[^] # Re: export de fonction
Posté par BFG . Évalué à 2.
zsh n'a pas cette fonctionnalité. Contrairement aux variables d'environnement, une fonction n'a de sens que dans un shell, ce qui fait qu'un autre processus aura peu de chances de pouvoir s'en servir (à moins qu'il ajoute une couche en invoquant en shell).
Les alias sont d'abord plus courts à écrire, et de plus, zsh possède des "alias globaux" qui me sont très utiles. Avec par exemple :
dans ma configuration, je peux écrire
make REN PG foo PL
plutôt quemake 2>/dev/null | grep foo | less
(j'utilise "PL" pour "pipe less", "PG" pour "pipe grep" et "REN" pour "redirection erreur null").Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.