IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

zsh et fonctions


Sujet :

Shell et commandes GNU

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 17
    Par défaut zsh et fonctions
    Salut otut le monde,

    Je n'ai pas vu de discussion sur le sujet, pourtant il doit bien y en avoir - je ne suis tout de même pas tout seul à ne pas comprendre ! ... si ? - Bref, désolé si ça fait doublon, mais voici le soucis.

    Je viens de me décider de me mettre à zsh. Et là, je veux utiliser des fonctions:
    J'ai un fichier .oh-my-zsh/functions/verifpart (exécutable et lorsque je l'exécute directement depuis lq console, pqs d'erreur)
    Mon script principal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #!/usr/bin/zsh
    #
    # Version avec cp -a et rsync
    #
    d=""
    d=$(date "+%d%B%Y")
    local cami=""
    local cami_mnt=""
    local repdest=""
    local repsrc=""
    local filtre=""
    local trace=""
    # Charger les fonctions qui sont dans le $FPATH à ~/.oh-my-zsh/functions
    autoload -t .oh-my-zsh/functions/verifpart
    autoload rsync_sauvegardes cpsauv
     
    .../...
    #pointe sur le répertoire de montage
    cami_mnt="/media/copie_interne"
    # Vérifier si la partition est bien montée, redirection de la sortie vers null pour ne pas avoir le massage
    verifpart $cami_mnt
    Au départ j'utilisait une autre version vu que FPATH contient le bon chemin vers les fonctions, puis j'ai adopté ce format explicite pour autoload.

    Quoiqu'il en soit, dans les deux cas j'obtient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    zsh -X $SCRIPTREPZSH/sauvegarde_hebdo_cp.zsh                 
    /home/katden/Documentos/Informatique/Programmation/scripts/zsh//sauvegarde_hebdo_cp.zsh:74: command not found: verifpart
    Notez le "//" dans le chemin du script ... ? ... (mais enfin ce n'est pas le problème)

    Pourriez-vous me dire pourquoi il ne trouve pas "verifpart" ? Merci bien.

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 749
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 749
    Par défaut
    Bonjour,

    essaie de mettre le chemin absolu vers verifpart ?
    mais ce serait bizarre qu'autoload ne chouine pas parce qu'il ne trouve pas le fichier.


    quant au double slash, c'est parce que la variable en contient un à la fin (c'est une mauvaise pratique); rien de grave
    un dysfonctionnement du forum insère ma signature dans tous mes messages, même si je ne le souhaite pas.
    C'est très pénible.

  3. #3
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 891
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 891
    Par défaut
    @Katden

    Tout d'abord, rassurez-vous concernant le double slash (//) que vous avez remarqué dans le chemin de votre script : les systèmes de type Unix l'interprètent simplement comme un / unique. Cela n'est donc pas la cause de l'erreur.

    Votre problème de command not found provient en réalité de deux comportements spécifiques de Zsh, qui sont très bien documentés dans le manuel officiel :

    1. L'environnement des scripts non interactifs :
      Lorsque vous exécutez un script via la commande zsh votre_script.zsh, Zsh démarre en mode "non interactif". Dans ce mode, il ne lit pas votre fichier ~/.zshrc. Par conséquent, toute la configuration générée par Oh-My-Zsh, y compris l'ajout de vos dossiers de fonctions à la variable $FPATH (ou $fpath), n'existe pas lors de l'exécution du script.
    2. La syntaxe de la commande autoload :
      La commande autoload attend le nom exact de la fonction à charger, et non le chemin d'accès vers le fichier. En écrivant autoload -t .oh-my-zsh/functions/verifpart, vous demandez à Zsh de chercher une fonction dont le nom serait littéralement ".oh-my-zsh/functions/verifpart", ce qui échoue.


    Pour que cela fonctionne, vous devez déclarer explicitement le dossier contenant vos fonctions dans la variable $fpath au début de votre script, puis appeler autoload uniquement avec le nom des fonctions.

    Voici la correction à appliquer dans votre script principal :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    #!/usr/bin/zsh
    ## Version avec cp -a et rsync
    #
    d=$(date "+%d%B%Y")
    local cami=""
    local cami_mnt=""
    local repdest=""
    local repsrc=""
    local filtre=""
    local trace=""
     
    # 1. On ajoute explicitement le dossier des fonctions au fpath du script.
    # (L'utilisation de $HOME est préférable à ~ dans les scripts)
    fpath=( "$HOME/.oh-my-zsh/functions" $fpath )
     
    # 2. On utilise autoload avec le nom des fonctions.
    # Note : L'option -U est fortement recommandée par la documentation 
    # pour éviter que d'éventuels alias n'interfèrent avec le chargement.
    autoload -U verifpart
    autoload -U rsync_sauvegardes cpsauv
     
    # ... suite de votre script ...
     
    # pointe sur le répertoire de montage
    cami_mnt="/media/copie_interne"
     
    # L'appel fonctionnera désormais correctement
    verifpart $cami_mnt
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  4. #4
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 749
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 749
    Par défaut
    vous demandez à Zsh de chercher une fonction dont le nom serait littéralement ".oh-my-zsh/functions/verifpart"
    zsh devrait au moins avertir qu'il ne trouve pas la fonction appelée !
    un dysfonctionnement du forum insère ma signature dans tous mes messages, même si je ne le souhaite pas.
    C'est très pénible.

  5. #5
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 891
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 891
    Par défaut
    J'ai pas compris, désolé, que voulez vous dire ? Qu'est-ce qui vous semble compliqué ?
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

Discussions similaires

  1. Réponses: 8
    Dernier message: 12/02/2013, 01h08
  2. Problème avec une fonction en utilisant Zsh
    Par Olivier Regnier dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 18/06/2007, 08h19
  3. Implémentation des fonctions mathématiques
    Par mat.M dans le forum Mathématiques
    Réponses: 9
    Dernier message: 17/06/2002, 16h19
  4. fonction printf
    Par ydeleage dans le forum C
    Réponses: 7
    Dernier message: 30/05/2002, 11h24
  5. FOnction api specifiant la position de la souris
    Par florent dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/05/2002, 20h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo