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 :

Retour sur sortie standard et exit avec un numéro


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    321
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 321
    Par défaut Retour sur sortie standard et exit avec un numéro
    Bonjour,

    Sur un fichier .sh

    je voudrais contrôler un paramètre à l'aide d'un écho et de lui donner un chiffre en erreur ( exit ) et en affichage sur la sortie standard.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    [ $# -eq 0 ] && echo "pas de reponse"; exit 3 >1&                   
    [ $# -gt 1 ] && echo "trop de reponse"; exit 4 >&1                               
    [ "$1" == o -o "$1" == O ] && echo "oui" && echo "oui"; exit 0 >&1                                          
    [ "$1" == n -o "$1" == N ] && echo "non"; exit 1 >&1                                          
    [ "$1" != n -o "$1" != N -o "$1" != o -o "$1" != O ] && echo "erreur"; exit 5 >&1
    la première ligne fonctionne mais ne me donne pas le bon retour d'erreur (3), si quelqu'un pouvait me donner quelques conseils...
    je ne veux pas utiliser le if

    merci d'avance

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 134
    Par défaut
    Bonjour,

    Si j'ai bien compris, quel que soit le nombre de paramètres et leur valeur, ton script s'interrompt dès la première ligne avec le code retour 3.
    Ce comportement est tout à fait normal.

    Le point-virgule est ici l'équivalent d'un retour à la ligne.
    Donc ta première ligne s'exécute ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [ $# -eq 0 ] && echo "pas de param"
    exit 3 >&1
    Si tu veux que la sortie dépende du message d'erreur, il suffit qu'elle lui soit liée logiquement.
    Tu pourrais écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [ $# -eq 0 ] && echo "pas de param"
    [ $# -eq 0 ] && exit 3
    Mais le test serait redondant.

    Sachant que l'exécution de la commande echo sera couronnée de succès mais ne s'exécutera que si [ $# -eq 0 ] est vérifié, il sera plus simple d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [ $# -eq 0 ] && echo "pas de param" && exit 3
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    321
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 321
    Par défaut
    merci pour ta réponse al1_24 al1_24

    Sve@r>> je voulais le faire sans les if

    Flodelarab >> ha ok , je n'avais pas vu cette exemple [ $# -eq 0 ] && { echo "pas de param"; exit 3;}

    La solution 3 est la mieux sinon les enchainements d'expression ne se faisait pas..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #!/bin/bash                                                                               
     
    [ $# -eq 0 ] && echo "Vous n'avez pas donne votre reponse" && exit 3                      
    [ $# -gt 1 ] && echo "Donnez une seule reponse" && exit 4                                 
    [ "$1" == o -o "$1" == O ] && echo "oui" && echo "oui" && exit 0                          
    [ "$1" == n -o "$1" == N ] && echo "non" && exit 1                                        
    [ "$1" != n -o "$1" != N -o "$1" != o -o "$1" != O ] && echo "Pas compris" && exit 5
    j y vois un peu plus clair..

    merci à vous 3 (seulement 2 semaines de bash mais bon , j'avance)

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 658
    Par défaut
    Citation Envoyé par Bernard111[/quote
    je ne veux pas utiliser le if
    c'est quoi ce gros caprice ?

    de plus, si je passe "oui, non, peut-être" à ton script, ça comptera comme un seul argument.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 288
    Par défaut
    Permettez quand même d'alerter sur les connecteurs && et ||. Ils s'activent sur la dernière commande effectuée. Donc une commande comme celle qui suit pose problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    commande1 && commande2 || commande3
    On aurait tort de croire que cela imite un if. Si la commande2 plante, autrement dit, si elle renvoie un code erreur non nul, alors la commande3 est exécutée !!! On a alors exécution de commande1, commande2, commande3.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    321
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 321
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    Permettez quand même d'alerter sur les connecteurs && et ||. Ils s'activent sur la dernière commande effectuée. Donc une commande comme celle qui suit pose problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    commande1 && commande2 || commande3
    On aurait tort de croire que cela imite un if. Si la commande2 plante, autrement dit, si elle renvoie un code erreur non nul, alors la commande3 est exécutée !!! On a alors exécution de commande1, commande2, commande3.
    Tu peux me détailler ta réponse Flodelarab stp ?.

    si je fait :

    $ [ -f fichier ] && cat fichier || echo "le fichiern'existe pas" >&2

    Mon résonnement :
    si fichier existe, le résultat de [ -f fichier ] est 0 ce qui provoque l’exécution de la commande
    cat fichier. Cette dernière réussit, son code retour est 0 et par conséquent la commande echo
    est ignorée
    si fichier n’existe pas, le résultat de [ -f fichier ] est 1, la commande cat fichier ne s’exécute
    pas, le résultat de l’enchaînement [ -f fichier ] && cat fichier est le code retour de la seule
    commande qui a été exécutée : [ -f fichier ], c’est-à-dire 1. Par conséquent la commande echo
    qui suit || sera exécutée et le message s’affichera.

    donc ce n'est pas toujours correcte ce genre d'expression ?, il faudrait rajouter un contrôle du code retour ?

    merci

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    321
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 321
    Par défaut
    ok

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    321
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 321
    Par défaut
    Sve@r Sve@r>>> j'ai bien conscience de tt ça... c'est juste un exercice..
    Je trouve la solution sans contournement. De mon point de vue ça me permet de progresser .
    Je ne comprenais pas pourquoi un simple "; exit" derrière le echo ne fonctionnait pas.

    J'avais déjà la solution du if.

  9. #9
    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 bernards111 Voir le message
    Sve@r>> je voulais le faire sans les if
    J'espère que tu as écrit cet imparfait de l'indicatif parce que tu as pris conscience qu'en shell, on ne peut pas toujours faire comme on veut. Le shell reste limité, c'est à toi te t'adapter à ce qu'il te propose.
    Ceci dit, je ne vois pas ce qu'un "if" peut avoir de rédhibitoire.
    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]

  10. #10
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 323
    Par défaut
    bonjour

    normal car tu as écrit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    [ $# -eq 0 ] && echo "pas de param"; 
    exit 3 >&1;                   
    [ $# -gt 1 ] && echo "trop de reponse";
    exit 4 >&1
    Tu sors toujours (ici) ligne 2

    ps: un echo est par défaut dans tty1 et faire la redirection après le sortie du programme ... mais je n'ai peut-être pas bien compris si tu désires en plus afficher le code erreur ? alors tu l'ajoutes à ton echo

  11. #11
    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
    Bonjour
    Citation Envoyé par bernards111 Voir le message
    je voudrais contrôler un paramètre à l'aide d'un écho et de lui donner un chiffre en erreur ( exit ) et en affichage sur la sortie standard.
    Dans ce cas, il te faut afficher sur la sortie standard puis sortir en erreur. L'instruction exit 3 >1& ne veut absolument rien dire (en fait elle signifie "envoie l'affichage de exit sur la sortie standard" mais comme exit n'affiche rien...)

    Ensuite il faut se méfier des raccourcis. Dans l'instruction expression && commande1 ; commande2, le point-virgule étant un séparateur, la commande 2 sera tout le temps exécutée et ce, même si l'expression est fausse.
    On peut passer par des parenthèses, comme expression && ( commande1 ; commande2 ) mais les parenthèses induisant un sous-processus, je ne sais pas comment le script se comportera quand la "commande2" est un "exit" (et franchement pour ce genre d'inutilité j'ai un peu la flemme de chercher).
    Donc tu veux écrire un script, tu écris un script !!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if [ $# -eq 0 ]; then
    	echo "pas de reponse"
    	exit 3
    fi
    ...
    Et là, demandé proprement, ton script fera les choses proprement.
    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]

  12. #12
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 288
    Par défaut
    Bonjour

    (en fait elle signifie "envoie l'affichage de exit sur la sortie standard" mais comme exit n'affiche rien...)
    Non. En fait, elle veut dire mais l'affichage standard dans le fichier 1 et fait le en arrière plan. La preuve en image :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ echo 3 >1&
    [1] 347432
    $ 
    [1]+  Fini                    echo 3 > 1
    $ cat 1 
    3
    $
    @al1_24 : Que de détours ! Pourquoi ne pas regrouper les commandes ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [ $# -eq 0 ] && { echo "pas de param"; exit 3;}

  13. #13
    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 Flodelarab Voir le message
    @al1_24 : Que de détours ! Pourquoi ne pas regrouper les commandes ?
    Je pense qu'il n'a pas conscience qu'elles sont dégroupées. Les mettant sur la même ligne, il doit probablement les voir comme déjà implicitement regroupées...
    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]

Discussions similaires

  1. probleme d'affichage sur sortie standard
    Par lastico21000 dans le forum C
    Réponses: 6
    Dernier message: 27/10/2011, 20h39
  2. Rediriger la sortie standard d'erreur avec un traitement
    Par bubulemaster dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 16/02/2011, 18h16
  3. Ecrire sur la sortie standard avec write
    Par overlolo dans le forum Débuter
    Réponses: 8
    Dernier message: 13/04/2009, 00h07
  4. Affichage sur sortie standard
    Par boubouc dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 01/05/2006, 04h54
  5. PB sortie standard avec les PTHREAD !!!
    Par djspit dans le forum C++
    Réponses: 15
    Dernier message: 19/11/2004, 01h17

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