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 :

pdksh AIX : peut-on inhiber la vérification syntaxique d'un fichier sourcé ?


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut pdksh AIX : peut-on inhiber la vérification syntaxique d'un fichier sourcé ?
    Bonjour,

    je voudrais que mon ~/.kshrc puisse être le même pour du ksh que pour du bash.

    Pour cela, j'ai mis les fonctions spécifiques bash à la fin, après un return si le shell est un ksh.

    ça marche bien sous Linux 2.6.18-128.7.1.el5 (KSH_VERSION='@(#)PD KSH v5.2.14 99/07/13.2'), mais ça ne marche pas sous AIX (je ne sais pas quelle version de pdksh) car ce dernier vérifie manifestement la syntaxe de TOUT le fichier avant de commencer à le sourcer!!!

    Est-il possible d'inhiber ce comportement?

    Voici un exemple hyper-simplifié avec une erreur de syntaxe volontaire pour illustrer le problème:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ cat ./bug_syntax.ksh 
    echo coucou
    return 0
    fi
    Et voici le comportement sous linux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    linux$ . ./bug_syntax.ksh 
    coucou
    ça me convient parfaitement.

    Et voici le comportement sous AIX:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    AIX$ . ./bug_syntax.ksh                  
    ksh: 0403-057 Syntax error: `fi' is not expected.
    Même en rajoutant des "set -x" ou "set -v", rien n'y fait! Il refuse systématiquement d'exécuter les lignes "echo" et "return".

    Quelqu'un a-t-il une idée pour changer ce comportement?

    Merci d'avance
    )jack(

  2. #2
    Expert confirmé Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Par défaut
    a ma connaissance on peut pas changer ce comportement sous AIX, mais un second avis devrai confirmer.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Salut,

    Je ne comprends pas très bien ta logique. Pourquoi vouloir à tout prix masquer un problème plutôt que d'essayer de le corriger?

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par Mygale1978 Voir le message
    Salut,

    Je ne comprends pas très bien ta logique. Pourquoi vouloir à tout prix masquer un problème plutôt que d'essayer de le corriger?
    J'avais simplifié l'exemple pour ne pas vous importuner avec un long discours ni prendre trop de votre temps, mais, puisque tu me demandes explicitement ma logique, la voici:

    En fait, j'ai 2 besoins:
    -1- debeuguer un programme ksh
    J'ai un "script.ksh" qui "charge" plein de fichiers de fonctions et contient (entre autres):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    . chemin/vers/script_avec_bug.ksh
    Le fichier "script_avec_bug.ksh" (de plusieurs centaines de lignes) contient une erreur de syntaxe pas évidente à trouver (genre un backquote unique à l'intérieur d'un "$( ...`...)", par exemple).
    Lorsque j'exécute "script.ksh" sous AIX, j'ai un (laconique) message qui ne me renseigne pas sur l'endroit du bug!
    Et l'option "set -x" ou l'insertion de traces ne fonctionne pas.
    En fait, on a déjà résolu un problème semblable par dichotomie (en supprimant la moitié des fonctions, puis le quart, etc.), mais c'est beaucoup plus fastidieux qu'un simple "set -x" au début du fichier!

    -2- ~/.kshrc
    je voudrais bien avoir un unique fichier ~/.kshrc qui fonctionne aussi bien pour un ksh que pour un bash.
    Pour cela, j'ai mis les fonctions spécifiques bash à la fin, après un return si le shell est un ksh:
    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
    # ----------------------------------------------------------------
    # [jack] 110120 Alias common to ksh and bash
    [snip]
    # ----------------------------------------------------------------
    # [jack] 111118 Specific to ksh
    
    if ! dirs >/dev/null 2>&1 ; then
        # Not a bash
        set -o emacs
        stty erase 
        if [ -z "${COLUMNS-}" ] ; then export COLUMNS=180 ; fi
        [snip]
        return 0
    fi
    
    # ----------------------------------------------------------------
    # [jack] 110131 Alias specific to bash (not suitable for ksh)
    
    alias dsa='dirs | tr '\'' '\'' '\''\n'\'''
    
    function ds {
        for (( i=0; i<${#DIRSTACK[@]}; i++ )); do
    	printf "%2d %s\n" $i ${DIRSTACK[$i]}
        done | sed -e "s:${HOME}:~:"
    }
    
    [snip]
    AIX refuse d'exécuter la moindre ligne du script sous prétexte qu'il contient "for ((" alors que je ne lui demande pas d'aller jusque là, mais de s'arrêter au "return"!

    S'il est vraiment impossible de changer le comportement du ksh sous AIX, j'aurai toujours la ressource d'abandonner le souhait d'avoir un unique fichier (facile à transporter de machine en machine et à administrer) pour le remplacer par 3 fichiers (après vérification):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if [[[[test que le shell est un ksh]]]] ; then 
        . .ksh_aliases
    elif [[[[test que le shell est un bash]]]] ; then
        . .bash_aliases
    fi
    Voilà donc mes problèmes.

    Merci de votre patience!

    )jack(

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 833
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    En fait, on a déjà résolu un problème semblable par dichotomie (en supprimant la moitié des fonctions, puis le quart, etc.), mais c'est beaucoup plus fastidieux qu'un simple "set -x" au début du fichier!
    Salut

    Tu peux aussi essayer d'identifier grossièrement la zone (style une trentaine de lignes) qui pourraient contenir le bug et mettre "set -x" en début de cette zone et "set +x" après...


    Citation Envoyé par jack-ft Voir le message
    -2- ~/.kshrc
    je voudrais bien avoir un unique fichier ~/.kshrc qui fonctionne aussi bien pour un ksh que pour un bash.
    Pour cela, j'ai mis les fonctions spécifiques bash à la fin, après un return si le shell est un ksh:
    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
    # ----------------------------------------------------------------
    # [jack] 110120 Alias common to ksh and bash
    [snip]
    # ----------------------------------------------------------------
    # [jack] 111118 Specific to ksh
    
    if ! dirs >/dev/null 2>&1 ; then
        # Not a bash
        set -o emacs
        stty erase 
        if [ -z "${COLUMNS-}" ] ; then export COLUMNS=180 ; fi
        [snip]
        return 0
    fi
    
    # ----------------------------------------------------------------
    # [jack] 110131 Alias specific to bash (not suitable for ksh)
    
    alias dsa='dirs | tr '\'' '\'' '\''\n'\'''
    
    function ds {
        for (( i=0; i<${#DIRSTACK[@]}; i++ )); do
    	printf "%2d %s\n" $i ${DIRSTACK[$i]}
        done | sed -e "s:${HOME}:~:"
    }
    
    [snip]
    AIX refuse d'exécuter la moindre ligne du script sous prétexte qu'il contient "for ((" alors que je ne lui demande pas d'aller jusque là, mais de s'arrêter au "return"!
    Bizarre. Je confirme que le shell standard interprète et exécute chaque ligne qu'il voit quand il la voit. C'est d'ailleurs pour ça qu'on est obligé d'écrire les fonctions avant de les appeler. Toutefois j'ai déjà eu de mon coté des surprises avec le ksh d'AIX. Notemment un truc de ce genre
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #!/bin/ksh
    i=0
    cat /etc/passwd | while read l
    do
        i=`expr $i + 1`
    done
    echo $i
    Et d'avoir en fin de boucle (donc en dehors du processus qui a modifié la variable) la bonne valeur pour i

    Citation Envoyé par jack-ft Voir le message
    S'il est vraiment impossible de changer le comportement du ksh sous AIX, j'aurai toujours la ressource d'abandonner le souhait d'avoir un unique fichier (facile à transporter de machine en machine et à administrer) pour le remplacer par 3 fichiers (après vérification):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if [[[[test que le shell est un ksh]]]] ; then 
        . .ksh_aliases
    elif [[[[test que le shell est un bash]]]] ; then
        . .bash_aliases
    fi
    Il semble en effet que c'est ce qu'il y a de mieux à faire...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Salut
    Tu peux aussi essayer d'identifier grossièrement la zone (style une trentaine de lignes) qui pourraient contenir le bug et mettre "set -x" en début de cette zone et "set +x" après...

    Bizarre. Je confirme que le shell standard interprète et exécute chaque ligne qu'il voit quand il la voit.
    Ben justement non!!!!! (en tout cas, pas chez moi)

    Je te rappelle que c'est une erreur de syntaxe et non un bug et que le pdksh d'AIX n'exécute AUCUNE ligne tant qu'il reste des erreurs de syntaxe!
    Pas même un "set -x" ni un "echo".
    C'est ce que j'explique dans mon premier message et c'est précisément ce comportement que je cherche à modifier!
    Je voudrais bien pouvoir mettre un "set -x" ou un "echo" dans mon fichier pour localiser l'erreur de syntaxe!

    Oops! Note importante: je viens de refaire un essai et j'ai été surpris de le voir exécuter les premières lignes d'un nouveau fichier de test contenant des erreurs de syntaxe... puis je me suis aperçu que j'avais fait (quasiment sans y penser) un "chmod +x test.ksh". Or, c'est précisément ce qu'il ne faut pas faire! En fait, ce comportement particulier se produit uniquement lorsqu'on SOURCE le fichier et non lorsqu'on l'exécute.
    (Évidemment, il est clair que c'est beaucoup moins clair en ksh qu'en csh!)

    Sve@r, peux-tu me confirmer que tu as bien sourcé et non exécuté ton fichier de test?

    Il semble en effet que c'est ce qu'il y a de mieux à faire...
    J'ai effectivement découpé mon (maigre) .kshrc en 2 mais ça ne résout pas mon problème pour la recherche de bugs dans un gros script qui source plusieurs autres gros scripts... quoique... je vais voir si je peux utiliser cette différence de comportement en essayant d'exécuter plutôt que sourcer...

    )jack(

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Vérification du nombre de fichier uploadé
    Par leclone dans le forum Langage
    Réponses: 7
    Dernier message: 06/06/2008, 08h38
  2. Comment peut on attaquer une BD MYSQL par un fichier C
    Par adilovic2000 dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 11/05/2006, 11h04
  3. Réponses: 1
    Dernier message: 29/03/2006, 09h29
  4. Réponses: 2
    Dernier message: 23/02/2006, 09h02
  5. Vérification syntaxique d'une adresse email
    Par Tchupacabra dans le forum Access
    Réponses: 5
    Dernier message: 14/12/2005, 08h35

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