Forum Programmation.shell GNU parallel et function zsh

Posté par  (site web personnel) .
Étiquettes : aucune
0
24
oct.
2012

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  (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 :

    ls . | parallel echo
    
    

    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

    #!/bin/bash
    
    function func () {
       echo "appel"
       echo $1
    }
    export -f func
    ls . | parallel func 
    
    

    Fuse : j'en Use et Abuse !

  • # export de fonction

    Posté par  . É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  (site web personnel) . Évalué à 2.

      declare -fx
      
      

      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  . É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 :

        alias -g PL='| $PAGER'
        alias -g PG='| grep'
        alias -g PGI='| grep -i'
        alias -g REN='2>/dev/null'
        
        

        dans ma configuration, je peux écrire make REN PG foo PL plutôt que make 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.