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

Administration système Discussion :

Tester des conditions BASH en C++


Sujet :

Administration système

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2008
    Messages : 69
    Par défaut Tester des conditions BASH en C++
    Bonjour, dans mon programme C++, j'ai besoin de faire des testes de conditions BASH ( if [ -a /home/user/unFichier.tx]; then ). Je sais que je peut reecrire ces trucs en c++, mais ce n'est pas le but, le but est vraiment de tester des conditions bash, c'est tout. Pour cela, bash donne une commande nomme "test". C'est cette commande qui verifie la veracitee des conditions en bash. La reponse de cette commande va dans dans la variable locale $?. Pour executer le teste, j'ai fait 2 popen, un qui execute la commande teste et l'autre un "echo $?". Mais cela ne fonctionne pas. Voici mes questions:

    Pourquoi?
    Comment faire pour recuperer directement une variable bash locale sans passer par un fork+exec ou un popen?
    Si possible, comment avoir la liste de ces variables locale? Il est possible de le faire facilement pour les variables systemes, allors si les variables locale ne sont pas implementer par le terminal lui meme, il est surement possible d'en avoir la liste aussi.
    Ou si ma methose ne va nul part, comment est-ce que je fait sans reeimplementer la syntax au complet?

    Actuelement, j'utilise un petit script avec mon popen (test $1; echo $?), ce qui fonctionne, mais est solidement mauvais point de vue qualitee de code, trouver une meilleur solution est assez important, meme si c'est seulement pour ma conaissance personelle.

  2. #2
    Membre très actif

    Inscrit en
    Juillet 2008
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 186
    Par défaut
    Bonjour,

    La variable $? contient en fait la valeur de retour de la commande bash précédente. Cette valeur est celle retournée par la fonction pclose(). Pas besoin donc de second appel à popen.

    Didier

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2008
    Messages : 69
    Par défaut
    Desoler pour ne pas avoir repondu dans des delais acceptable, mais j'ai eu une semaine d'examen et aucun temps pour travailler sur ce projet. Cela semble fonctionner!Voici le code pour les googleur
    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
    #include <iostream>
      bool ScriptEditor::evalCondition(QString line) {
        line = line.mid(line.indexOf("[")+1, (line.count() - (line.indexOf("[")+1)));
        line = line.left(line.indexOf("]")).trimmed();
     
        line = "test " + line;
        char buffer[30];
        FILE *JOB = popen(line.toStdString().c_str(), "r" );
     
        if ( JOB != NULL ) {
          while ( fgets( buffer, sizeof buffer, JOB ) != NULL ) {}
        }
        bool toReturn = pclose(JOB);
        printf("\n \n %d \n \n",toReturn);
        return !toReturn;
      }

  4. #4
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Attention, la valeur de retour de pclose() contient le code de retour du programme, mais pas que ça. Il faut extraire la valeur de retour en utilisant les macros WIFEXITED et WEXITSTATUS. "man 2 wait" pour plus d'infos.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2008
    Messages : 69
    Par défaut
    Je ne vois pas de cas ou un autre code serait retoune que >1 ou 0, dans tout les cas, c'est tout ce qui m'importe, non?

  6. #6
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Il y a plein d'infos dans le code de retour de popen (est ce que le process a terminé normalement pas un exit(), est-ce qu'il s'est fait terminer par un signal, est-ce qu'il est stoppé...), et il y a même certains bits qui peuvent servir à indiquer différentes choses suivant l'état d'autres bits (le signal qui a terminé le processus, la raison pour laquelle il est stoppé...). Bref pour récupérer le code de retour d'un programme il faut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (WIFEXITED(status)) {
            rc = WEXITSTATUS(status);
    }

Discussions similaires

  1. [AC-2010] Tester des conditions sur une boucle d'insertion de champs
    Par sardaucar dans le forum VBA Access
    Réponses: 2
    Dernier message: 24/10/2014, 14h19
  2. [PHP 5.3] Tester des conditions dans une boucle for
    Par coulane dans le forum Langage
    Réponses: 4
    Dernier message: 16/06/2010, 11h50
  3. [Data] Tester des services Spring
    Par rozwel dans le forum Spring
    Réponses: 6
    Dernier message: 12/11/2005, 00h00
  4. Tester des DOMAINS sur Base INTERBASE 6.0
    Par Thierry Laborde dans le forum InterBase
    Réponses: 3
    Dernier message: 28/09/2005, 13h59
  5. [Compilateur] Optimisation des conditions
    Par Pedro dans le forum Langage
    Réponses: 2
    Dernier message: 16/06/2004, 13h49

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