1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    mars 2018
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : mars 2018
    Messages : 1
    Points : 1
    Points
    1

    Par défaut code retour de fonctions déclarées // fonctions chargées via autoload

    Bonjour,

    afin de réutiliser plusieurs morceaux de codes gérant les différents traitement de mon projet, j'ai mis en place des bibliothèques via FPATH et autoload avec ksh. J'urilise /usr/bin/ksh sur AIX 7.1.
    J'ai un comportement étrange entre l'utilisation de fonctions déclarées dans le shell courant et appelées via autoload.

    Un exemple sera certainement plus parlant:
    Soient les 2 fonctions suivantes:
    - function fa { return 2; }
    - function fb { [[ $? -ne 0 ]] && echo "ERR" || echo "ok"; }
    si je les déclare dans le shell, que j'appelle fa puis fb, j'ai bien le message ERR qui s'affiche:
    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
    [user@partition - /home/user]
    # function fa { return 2;}
    [user@partition - /home/user]
    # fa
    [user@partition - /home/user]
    # echo $?
    2
    [user@partition - /home/user]
    # function fb { [[ $? -ne 0 ]] && echo "ERR" || echo "ok"; }
    [user@partition - /home/user]
    # fb
    ok
    [user@partition - /home/user]
    # fa
    [user@partition - /home/user]
    # fb
    ERR
    [user@partition - /home/user]
    #
    en revanche, si je colle ces 2 fonctions dans des fichiers séparés portant leur nom, que je déclare le dossier contenant ces 2 fichiers dans FPATH puis que je les charge via autoload; lorsque j'appelle fa puis fb, c'est le message OK qui s'affiche.
    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
    [user@partition - /home/user]
    # echo 'function fa { return 2;}'> fa
    [user@partition - /home/user]
    # echo 'function fb { [[ $? -ne 0 ]] && echo "ERR" || echo "ok"; }' > fb
    [user@partition - /home/user]
    # export FPATH=$PWD
    [user@partition - /home/user]
    # autoload fa
    [user@partition - /home/user]
    # autoload fb
    [user@partition - /home/user]
    # fa
    [user@partition - /home/user]
    # fb
    ok
    [user@partition - /home/user]
    #
    j'aimerais que la seconde méthode m'affiche "ERR" et non "ok".
    Je suis aussi preneur du pourquoi ça ne fonctionne pas.

    Merci d'avance
    Sébastien

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

    Informations forums :
    Inscription : février 2008
    Messages : 4 979
    Points : 12 878
    Points
    12 878

    Par défaut

    Bonjour,

    ouais, ben, c'est pas clair cette histoire.

    c'est comme si la première exécution de fb testait autre chose que le résultat de la commande précédente.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ export FPATH=$PWD; autoload fa; autoload fb; typeset -ft fb                                                                                                                                                                                                            
    $ false; fb                                                                                                                                                                                                                                                              
    + test 0 -ne 0                                                                                                                                                                                                                                                           
    + echo ok
    ok
    $
    àmha, n'utilisant pas souvent ksh, je mettrais toutes mes fonctions utiles dans un seul fichier que je sourcerais.
    ça me parait plus simple, et plus sûr.

    EDIT: voir ceci.
    de ce que je comprends, la première exécution de la fonction ne fait que la charger dans l'environnement courant.
    .
    N'oubliez pas de consulter la FAQ et les cours shell

  3. #3
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    juin 2007
    Messages
    2 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juin 2007
    Messages : 2 692
    Points : 7 850
    Points
    7 850

    Par défaut

    Citation Envoyé par Sébastien.th Voir le message

    j'aimerais que la seconde méthode m'affiche "ERR" et non "ok".
    Je suis aussi preneur du pourquoi ça ne fonctionne pas.
    C'est une différence assez subtile d'implémentation entre ksh88 et ksh93.

    Avec ksh88, lors du premier chargement d'une fonction via le FPATH, le code retour de la commande précédente est perdu, et c'est le code retour du chargement qui prend sa place, comme si la fonction avait été chargée explicitement. Par la suite, le fonctionnement est correct.

    Avec ksh93, ce chargement s'effectue de manière transparente et n'affecte pas le code retour préexistant.

    Si tu as ksh93 sur ton AIX, utilise-le, sinon, il suffit que tu charges explicitement la fonction fb (et toute fonction qui traite le code retour de la commande précédente).

    Pour charger une fonction en ksh, il faut utiliser la builtin . (point) et pas source qui n'existe pas en standard sous ksh88 (on peut faire un alias si on a l'habitude de ce bashisme).

    Contrairement à ce que tu as l'air de penser, la builtin autoload ne charge pas une fonction. Elle sert seulement à dire au shell d'ignorer toute commande présente dans le PATH qui aurait le même nom que la fonction que tu déclares. Je n'utilise jamais autoload, et fais simplement attention à avoir des noms de fonctions uniques.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # FPATH=$PWD
    # fa;fb
    ok            # première exécution, résultat inattendu
    # fa;fb
    ERR           # deuxième exécution correcte
    # ksh
    # FPATH=$PWD
    # . ./fb      # préchargement de la fonction
    # fa;fb
    ERR           # correct du "premier" coup...
    On peut d'ailleurs constater que la fonction bash autoload, fournie avec les exemples de scripts ( https://www.apt-browse.org/browse/ub...ns/autoload.v3 ) présente exactement le même problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $ bash
    $ echo $BASH_VERSION
    4.3.11(1)-release
    $ . ./autoload
    $ FPATH=$PWD
    $ autoload fa
    $ autoload fb
    $ fa;fb
    ok
    $ fa;fb
    ERR
    ɹǝsn *sıɹɐlos*

Discussions similaires

  1. Générer du code HTML en fonction des données MySQL via PHP
    Par Nicolas Eggs dans le forum PHP & MySQL
    Réponses: 6
    Dernier message: 08/08/2016, 15h24
  2. code retour d'une fonction return 0 ?
    Par BoxOfTheNight dans le forum C
    Réponses: 6
    Dernier message: 11/08/2014, 11h10
  3. Réponses: 6
    Dernier message: 28/06/2014, 09h30
  4. Code retour des fonctions & typage
    Par domiq44 dans le forum C
    Réponses: 3
    Dernier message: 27/04/2011, 14h33
  5. [AJAX] Accès fonctions déclarées dans page chargée par Ajax
    Par yagrasdemonde dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 04/02/2008, 15h33

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