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

Linux Discussion :

[makefile] probleme de comparaison dans if test


Sujet :

Linux

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    Points : 376
    Points
    376
    Par défaut [makefile] probleme de comparaison dans if test
    j ai un petit souci dans mon makefile, la partie du code qui me pose problème ressemble à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cible : dépendance
    	if [ `cmp -s file1 file2` ] ; then echo "test vrai" ; else echo "test faux" ; fi
    a priori selon que les fichiers 1 ou 2 soient ou pas différents, ça devrais afficher test vrai ou test faux :

    file1 différent de file2 ==> test vrai
    file1 similaire à file2 ==> test faux


    Le problème c est que 'test faux' est affiché qu importe que mes fichiers soient ou pas différents. Pourquoi ??

    merci

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 271
    Points : 329
    Points
    329
    Par défaut
    `cmp -s toto.txt toto.txt` && [ $? -eq 0 ] && echo "test vrai" || echo "test faux"

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    Points : 376
    Points
    376
    Par défaut
    super je te remercie ça marche, à une petite précision près :

    $? désigne les dépendances en makefile
    donc il faut mettre $$?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    `cmp -s toto.txt toto.txt` && [ $$? -eq 0 ] && echo "test vrai" || echo "test faux"
    ou celle que je préfère :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if `cmp -s toto.txt toto.txt` && [ $$? -eq 0 ] ; then echo "test vrai" ; else echo "test faux" ; fi

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 720
    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 720
    Points : 31 037
    Points
    31 037
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Ashin Voir le message
    super je te remercie ça marche, à une petite précision près :

    $? désigne les dépendances en makefile
    donc il faut mettre $$?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    `cmp -s toto.txt toto.txt` && [ $$? -eq 0 ] && echo "test vrai" || echo "test faux"
    ou celle que je préfère :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if `cmp -s toto.txt toto.txt` && [ $$? -eq 0 ] ; then echo "test vrai" ; else echo "test faux" ; fi
    Totalement idiot autant dans le problème que dans la solution proposée. Pourquoi tu mets des backquottes ??? Le shell remplacera la commande par ce qu'elle affiche (c.a.d. rien) et exécute donc if [ ] then ... else ... => "rien" étant faux, ce sera toujours le "else"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if cmp -s toto.txt toto.txt; then echo "test vrai" ; else echo "test faux" ; fi
    Si jamais t'as un problème d'affichage parasite issu de la commande cmp, ben tu le rediriges et basta
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if cmp -s toto.txt toto.txt 1>/dev/null; then echo "test vrai" ; else echo "test faux" ; fi
    Les backquottes ont une fonction bien précise. Si la fonction en question n'est pas demandée alors pas de backquottes !!!

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    Points : 376
    Points
    376
    Par défaut
    en meme temps si je connaissais toutes les subtilités du shell ou des make files, je ne poserais pas de questions ici!!

    d ailleurs j ai pas compris ta solution :

    cmp -s file1 file2 ne pose pas de probleme mais que représente
    "1>/dev/null" ??


    sinon sa solution n est pas complètement bete, du moins elle fonctionne très bien.

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 720
    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 720
    Points : 31 037
    Points
    31 037
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Ashin Voir le message
    d ailleurs j ai pas compris ta solution :

    cmp -s file1 file2 ne pose pas de probleme mais que représente
    "1>/dev/null" ??
    Généralement les commandes d'Unix envoient des informations à l'écran. En l'ocurrence, si les fichiers sont différents cmp enverra un petit texte donnant la position du premier octet qui diffère.
    Là, ne voulant pas voir apparaître d'info "parasite" dans mon programme car c'est lui qui reprend tout à son compte et qui gère en conséquence, je redirige les textes éventuellement affichés par "cmp" dans le périphérique poubelle "/dev/null"

    Citation Envoyé par Ashin Voir le message
    sinon sa solution n est pas complètement bete, du moins elle fonctionne très bien.
    Dans ta (sa) solution, le shell commence par mettre son exécution en attente puis instancie un mécanisme d'appel spécial (les backquottes) destiné à récupérer ce que la commande "cmp" affiche. Puis le shell récupère ce que le sous-processus affiche (ici "rien" => le super mécanisme a donc été hyper utile).
    Ensuite le shell vérifie que ce processus s'est bien déroulé (le "&&" qui demande une vérification alors qu'un simple ";" aurait suffit) puis initialise une comparaison entre le code retour de la dernière commande (cmp) avec 0 (commande bien exécutée) pour faire un choix.

    Moi, j'appelle simplement la commande "cmp" et je vérifie qu'elle s'est bien exécutée pour faire un choix.

    Par ailleurs, j'avais pas fait attention à un petit détail dans ta (sa) solution => si jamais les fichiers sont différents, la commande "cmp" affichera "toto.txt titi.txt différents octet X" Le shell récupèrera tout cet affichage et l'utilisera dans le contexte où il se trouve. Or, dans ce contexte, il se trouve en début de ligne donc le shell croira qu'il s'agit d'une commande. Il tentera donc d'exécuter la commande "toto.txt" (qui n'existe probablement pas) et ça te donnera donc un petit message d'erreur. Petit bug pas bien méchant.
    Maintenant imaginons que tu tapes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    `cmp -s /bin/rm toto.txt` && [ $$? -eq 0 ] && echo "test vrai" || echo "test faux"
    Ben là, le shell recevra le message "/bin/rm toto.txt différents octet X" qu'il exécutera tranquillement => hop, effacé le fichier "toto.txt"...

    Voilà. J'ai un peu détaillé les différences entre sa solution et la mienne. On peut effectivement tuer une mouche avec un lance flamme. Ca fonctionne aussi très-bien mais c'est beaucoup d'efforts pour un petit résultat et parfois on crame la baraque avec. Mais c'est ton programme et t'es bien entendu libre de choisir la solution que tu préfères...

    Si tu veux apprendre le shell, regarde les cours Linux : http://linux.developpez.com/cours/

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    Points : 376
    Points
    376
    Par défaut
    ok, je te remercie de cette précision; je ne connaissais pas cette méthode.

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

Discussions similaires

  1. [WD16] Problemes comparaison dans SI avec OU ET
    Par WDKyle dans le forum WinDev
    Réponses: 4
    Dernier message: 30/04/2011, 00h51
  2. Réponses: 2
    Dernier message: 04/01/2004, 15h14
  3. [BPW]Problème de recherche dans une boîte liste
    Par Alcatîz dans le forum Turbo Pascal
    Réponses: 14
    Dernier message: 05/07/2003, 15h10
  4. Probleme d'éffacement dans le cookie
    Par Geulderack dans le forum XMLRAD
    Réponses: 6
    Dernier message: 02/04/2003, 14h17
  5. Probleme de filtre dans bdd
    Par scorpiwolf dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/06/2002, 10h43

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