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 :

Comment afficher un statut puis le rafraîchir en ksh ?


Sujet :

Shell et commandes GNU

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 378
    Points
    19 378
    Par défaut
    Citation Envoyé par al1_24
    J'insiste !
    à quel propos ?
    ça affiche «ko», puisque "" ne commence pas par "b" !
    c'est le cas "*" qui est traité, c'est à dire tous les cas qui ne sont pas explicitement donnés.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  2. #22
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    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 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Ben... j'insiste...

    Chez moi, le case plante et ne passe dans aucune clause:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ unset var
    $ set -o nounset
    $ case $var in b*) echo ok;; *) echo ko; esac
    -bash: var: unbound variable
    bon... j'avoue... je l'ai peut-être un peu cherché...

    Cependant lorsque j'écris un script, j'essaie de prendre en compte l'éventualité que l'utilisateur a pu positionner l'option nounset!

    C'est dans ce contexte que j'ai proposé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ unset var
    $ set -o nounset
    $ case ${var:-E} in b*) echo ok;; E) echo "var est E ou vide ou unset";; *) echo ko; esac
    var est E ou vide ou unset

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 378
    Points
    19 378
    Par défaut
    ah, bah oui, avec nounset, t'as même pas le droit de respirer : «ERR: vos poumons sont vides. Exterminer ! Exterminer ! ...»


    de mon côté, je préfère traiter l'éventualité d'une variable vide, que de me faire éjecter par le shell.

    mais, ce n'était, je crois, pas le propos d'al1_24.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #24
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    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 080
    Points : 30 786
    Points
    30 786
    Par défaut
    J'étais en effet persuadé d'avoir déjà rencontré des problèmes avec case en testant une variable initialisée à vide.
    Mais je ne sais plus sous quel environnement. Et je n'arrive pas à le reproduire avec le peu que j'ai sous la main maintenant (cygwin et pdksh ).
    Désolé d'avoir été insistant dans mon erreur;. :facepalm:
    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.

  5. #25
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    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 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    ah, bah oui, avec nounset, t'as même pas le droit de respirer : «ERR: vos poumons sont vides. Exterminer ! Exterminer ! ...»
    J'adore l'image!!!
    C'est vrai qu'avec l'option nounset, ça me donne l'impression, sinon de ne pouvoir respirer, du moins qu'on va éclater au moindre toussotement!

    de mon côté, je préfère traiter l'éventualité d'une variable vide, que de me faire éjecter par le shell.
    Ben, moi aussi. Mais, lorsque je teste une variable, j'aime bien aussi prendre en compte le cas où elle est non positionnée.

    Il existe quelques rares cas où ce n'est pas normal (par exemple, parce que c'est un sous-shell dont l'appelant avait comme obligation de positionner la variable au préalable).
    Dans ce cas, je le teste spécifiquement (en précondition du sous-shell) avec, par exemple, test -z "${var-x}" et je fais un exit avec un message clair et net.

    Mais, très souvent, voire la plupart du temps, soit la variable ne peut pas être non positionnée (car positionnée plus tôt dans le script), soit le comportement attendu est le même que la variable soit unset ou vide.
    Dans ce cas, un simple test -z "${var:-}" ou bien case "${var:-}" in '') echo 'vide';; *) echo 'autre'; esac suffit pour même gérer l'éventualité de l'option nounset positionnée.
    Je préfère donc ces tests aux habituels test -z "${var}" ou case "${var}" in '') echo 'vide';; *) echo 'autre'; esac (du moins, lorsque l'option chipotage est on ).

    [HS]Depuis quelque temps déjà, on peut avantageusement remplacer la balise [codeinline] par la balise [c] (c'est rigolo à formater, ça! ).[/HS]

  6. #26
    Membre averti Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Points : 383
    Points
    383
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    je ne suis pas très concentré : la fatigue

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    status=$(qsub ... | awk '...')
    until test -z "$status" -o "$status" = "E" # jusqu'à ce que ( $status n'existe pas ou est vide OU $status vaut E )
    do
       case $status in
          Q) printf ...;;
          R) printf ...;;
       esac
       status=$(qsub ... | awk '...')
    done
    et puis, tester qu'une variable n'est pas égale à rien ne m'est pas naturel.

    désolé pour le contretemps.
    Merci

    Désolé je revenir sur le sujet aussi tard, mais j'ai pas bossé sur ce code durant le week end.

    Mais je ne comprend pas cette notation until test ? Pourquoi utiliser test ?

    En fait c'est test qui est vérifié ?

    Merci

  7. #27
    Membre averti Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Points : 383
    Points
    383
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    Si on n'a pas peur, pour faire un test qui retourne true lorsque:
    soit le variable n'est pas définie (unset)
    soit elle est définie, mais vide
    soit elle vaut une certaine valeur 'E',
    on peut utiliser les accolades et le ":-" comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    until test "${status:-E}" = 'E'
    do
       case $status in
          Q) printf ...;;
          R) printf ...;;
       esac
       status=$(qsub ... | awk '...')
    done
    En plus, ç'a l'avantage de ne pas planter si on utilise l'option 'nounset'...
    J'ai testé ta manière de faire (ça fonctionne, enfin ça à l'air de fonctionner) et je ne savais pas que "${status:-E}" = 'E' permettait de vérifié tout ce que tu as énuméré !!!!! Les accolades

    Et moi je n'ai pas utilisé le case j'ai l'aissé mes if elif ...... ais-je tord de le faire ?

    Merci d'avance

  8. #28
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    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 695
    Points : 7 882
    Points
    7 882
    Par défaut
    Citation Envoyé par nekcorp Voir le message
    Mais je ne comprend pas cette notation until test ? Pourquoi utiliser [c]test[\c] ?

    En fait c'est [c]test[\c] qui est vérifié ?
    "test" est une instruction équivalente à "[", la seule différence est qu'elle ne demande pas de délimiteur de fin "]".

    La ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    until test -z "$status" -o "$status" = "E"
    est la même chose que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while [ -n "$status" -a "$status" != "E" ]
    qui est plus habituel comme syntaxe.
    ɹǝsn *sıɹɐlos*

  9. #29
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    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 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par nekcorp Voir le message
    Et moi je n'ai pas utilisé le case j'ai l'aissé mes if elif ...... ais-je tord de le faire ?
    Le case est équivalent au if+elif.

    Personnellement, je préfère utiliser le case chaque fois que c'est possible car je le trouve plus clair au premier coup d'oeil.
    Avec un test du genre "si a = 3 alors... sinon si a > 3 alors... sinon si b = 2 alors... sinon... fin si", on ne peut pas utiliser le case, donc on utilise le if+elif.
    Avec un test du genre "suivant la valeur de $status, qui peut être égale à soit 'Q' soit 'R' soit 'E'...", c'est le cas typique d'utilisation du case, qui me paraît donc préférable.

    [chipotage-HS]Sinon, je dirais que tu as tort d'avoir tord...
    Il se tord de douleur quand quelqu'un dit avoir tord...
    N'oublions pas que le tort t' tue. (mnémotechnique)

    [/chipotage-HS]

  10. #30
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    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 080
    Points : 30 786
    Points
    30 786
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    [chipotage-HS]Je me tord de douleur chaque fois que je vois quelqu'un avoir tord...[/chipotage-HS]
    Je préfère écrire que je me tords...
    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.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 378
    Points
    19 378
    Par défaut
    Citation Envoyé par jack-ft
    Le case est équivalent au if+elif.
    case est plus lisible, à mes yeux.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  12. #32
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    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 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Je préfère écrire que je me tords...
    Et tu n'as pas tort!!! Merci! Ça m'apprendra à me relire après modification!

  13. #33
    Membre averti Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Points : 383
    Points
    383
    Par défaut
    Merci à tous pour vos interventions.

    J'ai pu avancer dans mon code.

  14. #34
    Membre averti Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Points : 383
    Points
    383
    Par défaut
    Re,

    Je relance ce sujet car en fait il n'est pas tout à fait résolu

    Je viens de me rendre compte que lorsque mon statut sous linux via qstat passe en E (ce qui traduit que le job est terminé) la boucle until (j'ai testé avec l'équivalent en while) continue de tourner, alors qu'elle devrait se terminer. En fait la boucle se termine seulement lorsque $STATUS ne vaut rien.

    donc juste pour rappel, j'ai peut être mal exprimé mon problème :

    $STATUS renvoie le statut d'un job qui peut valoir Q,R,E et éventuellement rien, je récupère l'état de ce statut dans ma variable $STATUS.

    Si $STATUS = "Q" la boucle doit continuer
    Si $STATUS = "R" la boucle doit continuer
    Si $STATUS = "E" la boucle doit s'arrêter et l'utilisateur doit pouvoir reprendre la main.

    Cas rare mais qui peux arriver :

    $STATUS = "" (elle ne vaut rien) dans ce cas la boucle se termine et l'utilisateur reprend la main. Apparement ce dernier cas est traité avec le code. Ce qui cause problème c'est le cas où $STATUS="E"

    Voici le code :

    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
    29
     
    function status
    {
     
    until test "${STATUS:-E}" = 'E'
     
    do
         STATUS=$(qstat | grep "$ID_JOB.master" | awk '{print $5}')
     
         if [ "$STATUS" = "Q" ]
         then
               STATUS="Waiting ..."
     
         elif [ "$STATUS" = "R" ]
         then
               STATUS="Running ..."
     
     
         elif [ "$STATUS" = "E" ]
         then
               STATUS="Finished !"
     
         fi     	    
         printf "\rStatus job $ID_JOB : $STATUS"
    done
     
    STATUS="Finnished !"
    printf "\rStatus job $ID_JOB : $STATUS"
    printf "\n"
    Une idée ?

  15. #35
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    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 080
    Points : 30 786
    Points
    30 786
    Par défaut
    A l'intérieur de ta boucle, quand tu reçois E de ton job, tu le remplaces par Finished ce qui fait que le test "${STATUS:-E}" = 'E' n'est jamais vérifié
    C'est parce que tu utilises la même variable pour deux choses différentes ; d'une part la lettre du Statut retourné par ton job, d'autre part le message que tu veux afficher.
    En les séparant, tu auras tout de suite un meilleur résultat :
    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
    function status
    {
     
    until test "${STATUS_LTR:-E}" = 'E'
     
    do
         STATUS_LTR=$(qstat | grep "$ID_JOB.master" | awk '{print $5}')
     
         if [ "$STATUS_LTR" = "Q" ]
         then
               STATUS_MSG="Waiting ..."
     
         elif [ "$STATUS_LTR" = "R" ]
         then
               STATUS_MSG="Running ..."
     
     
         elif [ "$STATUS_LTR" = "E" ]
         then
               STATUS_MSG="Finished !"
     
         fi     	    
         printf "\rStatus job $ID_JOB : $STATUS_MSG"
    done
     
    STATUS_MSG="Finished !"
    printf "\rStatus job $ID_JOB : $STATUS_MSG"
    printf "\n"
    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.

  16. #36
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    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 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    A l'intérieur de ta boucle, quand tu reçois E de ton job, tu le remplaces par Finished ce qui fait que le test "${STATUS:-E}" = 'E' n'est jamais vérifié
    C'est parce que tu utilises la même variable pour deux choses différentes ; d'une part la lettre du Statut retourné par ton job, d'autre part le message que tu veux afficher.
    En les séparant, tu auras tout de suite un meilleur résultat :


    Et, avec le "case" (pff... faut lui faire tout le boulot):

    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
    function status() {
        until test "${STATUS_LTR:-E}" = 'E'
        do
            STATUS_LTR=$(qstat | grep "$ID_JOB.master" | awk '{print $5}')
     
            case "$STATUS_LTR" in
                Q) STATUS_MSG="Waiting..." ;;
                R) STATUS_MSG="Running..." ;;
                E) STATUS_MSG="Finished !" ;;
                *) STATUS_MSG="Unknown  !"
            esac
            printf "\rStatus job $ID_JOB : $STATUS_MSG"
        done
     
        STATUS_MSG="Finished !"
        printf "\rStatus job $ID_JOB : $STATUS_MSG"
        printf "\n"
    }

Discussions similaires

  1. [Objective-C] comment afficher dans un scrollview une image ou une vidéo puis du texte?
    Par Seelass dans le forum Objective-C
    Réponses: 0
    Dernier message: 17/07/2012, 15h55
  2. Réponses: 1
    Dernier message: 26/02/2010, 15h30
  3. iExlorer ou autres, comment afficher la barre de statut
    Par Rodolphe_1940 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 14/12/2006, 17h38
  4. Comment afficher les toolTipText dans une zone de statut ?
    Par nicok01 dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 28/01/2005, 13h32
  5. [TP][MULTI-PROBLEME]Comment afficher des images pcx
    Par mikoeur dans le forum Turbo Pascal
    Réponses: 7
    Dernier message: 24/10/2002, 13h57

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