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 :

Test d'existence des packages


Sujet :

Shell et commandes GNU

  1. #1
    Membre averti
    Homme Profil pro
    Gérant
    Inscrit en
    Février 2006
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Dom-Tom

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Février 2006
    Messages : 262
    Points : 329
    Points
    329
    Par défaut Test d'existence des packages
    Bonjour,

    Je fais un petit script pour tester l'existence des packages et s'ils sont installés ou non.

    Le script principal appel un fichier ou chaque ligne indique le package en question :
    apache2
    postfix
    azerty

    apache2 est présent et installé, postfix est présent mais pas installé et azerty est inexistant

    Le code ci-dessus vous montre le script :
    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
    INSTALL_PATH=/tmp
     
    >$INSTALL_PATH/pkg_installable
    >$INSTALL_PATH/pkg_installed
    >$INSTALL_PATH/pkg_no_installed
     
    for PACKAGE in `cat $INSTALL_PATH/pkg_list.txt | grep -v "#" | grep -vx "" | sed ':a;N;$!ba;s/\n/\ /g'`
    do
        #echo "$PACKAGE"
        if [ -z `apt-cache pkgnames | grep -q $PACKAGE` ]
        then
            if [ -z `apt-cache policy $PACKAGE | grep Installé | grep aucun` ]
            then
                echo "$PACKAGE Paquet non installé"
                echo "$PACKAGE" >>$INSTALL_PATH/pkg_no_installed
            else
                echo "$PACKAGE Paquet installé"
                echo "$PACKAGE" >>$INSTALL_PATH/pkg_installed
            fi
        else
            echo "$PACKAGE Aucun paquet"
            echo "$PACKAGE" >>$INSTALL_PATH/pkg_installable
        fi
    done
    Hors j'obtiens le résultats suivant qui ne correspond pas à la réalité :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    apache2 Paquet non installé
    ./script.sh: ligne 12 : [: Installé : : opérateur binaire attendu
    postfix Paquet installé
    azerty Paquet non installé
    Je devrais avoir en sortie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    apache2 Paquet installé
    postfix Paquet non installé
    azerty Aucun paquet
    Merci de m'éclairer, je ne vois pas où je fais l'erreur...

  2. #2
    Membre expérimenté
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Avril 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 875
    Points : 1 394
    Points
    1 394
    Par défaut
    déjà ton test en ligne X devrait s'écrire ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if (apt-cache pkgnames | grep -qx $PACKAGE)
    Le grep -x vérifie que la ligne renvoyée par apt-cache pkgnames correspond exactement à $PACKAGE, sinon tu auras trop de faux positif (par exemple apache est un faux positif).
    grep -x renvoie juste un code de retour qui est testé par if. 0 ou autre chose, je ne vois pas trop comment le test -z peut marcher ici.

    Même remarque pour le test suivant.

  3. #3
    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 376
    Points
    19 376
    Par défaut
    Bonjour,

    Benjile : l'emploi d'un sous-shell ((...)) ne se justifie pas.

    nazoreen : Comment lire/parcourir un fichier.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    apt-cache policy $PACKAGE | grep Installé | grep aucun
    pourquoi deux grep pour des motifs qui sont sur la même ligne ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Membre averti
    Homme Profil pro
    Gérant
    Inscrit en
    Février 2006
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Dom-Tom

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Février 2006
    Messages : 262
    Points : 329
    Points
    329
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    apt-cache policy $PACKAGE | grep Installé | grep aucun
    pourquoi deux grep pour des motifs qui sont sur la même ligne ?
    Bonjour

    En fait j'ai 2 réponses suivant que le paquet est présent dans la distro (Installé) mais pas installé (aucun) sinon cette deuxième réponse est la version du paquet installé.
    Si le paquet n'existe pas je n'ai rien, mais je n'arrive pas à savoir si en sortie c'est 0 ou quelque chose comme NULL

    En tout cas merci pour ta question, il est vrai que je peux simplement faire le test sur "aucun" !!!

    Pourquoi faire simple quand on peut faire compliqué

    Merci, je vais tester ça !

  5. #5
    Membre averti
    Homme Profil pro
    Gérant
    Inscrit en
    Février 2006
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Dom-Tom

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Février 2006
    Messages : 262
    Points : 329
    Points
    329
    Par défaut
    Citation Envoyé par Benjîle Voir le message
    déjà ton test en ligne X devrait s'écrire ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if (apt-cache pkgnames | grep -qx $PACKAGE)
    Le grep -x vérifie que la ligne renvoyée par apt-cache pkgnames correspond exactement à $PACKAGE, sinon tu auras trop de faux positif (par exemple apache est un faux positif).
    grep -x renvoie juste un code de retour qui est testé par if. 0 ou autre chose, je ne vois pas trop comment le test -z peut marcher ici.

    Même remarque pour le test suivant.
    Bonjour,

    -z pour trouver si l'occurence est vide ou NULL
    Je n'ai pas cru bon de préciser -x puisque de toute façon la sortie ne me donne qu'une ligne par paquet et comme c'est moi qui met dans la ligne le nom exact j'évite le faux positif comme apache

    Je vais faire la modification...

    Merci.

  6. #6
    Membre averti
    Homme Profil pro
    Gérant
    Inscrit en
    Février 2006
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Dom-Tom

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Février 2006
    Messages : 262
    Points : 329
    Points
    329
    Par défaut
    Bonjour,

    J'ai modifié le script puisque vos solutions n'ont pas changé les données en sortie.

    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
    INSTALL_PATH=/tmp
     
    >$INSTALL_PATH/pkg_installable
    >$INSTALL_PATH/pkg_installed
    >$INSTALL_PATH/pkg_no_installed
     
    for PACKAGE in `cat $INSTALL_PATH/pkg_list.txt | grep -v "#" | grep -vx "" | sed ':a;N;$!ba;s/\n/\ /g'`
    do
        #echo "$PACKAGE"
        if [ ! -z `apt-cache pkgnames | grep -x $PACKAGE` ]
        then
            if [ `apt-cache policy $PACKAGE | grep -c 'none\|aucun'` = 0 ]
            then
                echo "$PACKAGE Paquet installé"
                echo "$PACKAGE" >>$INSTALL_PATH/pkg_installed
            else
                echo "$PACKAGE Paquet non installé"
                echo "$PACKAGE" >>$INSTALL_PATH/pkg_no_installed
            fi
        else
            echo "$PACKAGE Aucun paquet"
            echo "$PACKAGE" >>$INSTALL_PATH/pkg_installable
        fi
    done
    est-ce que j'aurais des faux positif, je n'en sais rien, mais pour l'instant ça me donne bien le résultat escompté :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    apache2 Paquet installé
    postfix Paquet non installé
    azerty Aucun paquet
    Merci pour votre aide.

  7. #7
    Membre expérimenté
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Avril 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 875
    Points : 1 394
    Points
    1 394
    Par défaut
    @Nazoreen: en fait en GNU -z renvoie vrai si la chaine testée est de longueur nulle. Mais grep -q sera toujours évalué comme une chaine de longueur nulle, quelque soit sa valeur de retour. C'est pour ça que dans ton script le cas "aucun paquet" n'apparaissait pas.

    @N_bah: merci pour le commentaire

  8. #8
    Membre averti
    Homme Profil pro
    Gérant
    Inscrit en
    Février 2006
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Dom-Tom

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Février 2006
    Messages : 262
    Points : 329
    Points
    329
    Par défaut
    Citation Envoyé par Benjîle Voir le message
    @Nazoreen: en fait en GNU -z renvoie vrai si la chaine testée est de longueur nulle. Mais grep -q sera toujours évalué comme une chaine de longueur nulle, quelque soit sa valeur de retour. C'est pour ça que dans ton script le cas "aucun paquet" n'apparaissait pas.

    @N_bah: merci pour le commentaire
    Merci, je me suis fait la même réflexion, c'est pour ça que j'ai choisi l'option de compter le nombre de résultat. J'évite l'option silencieuse de grep en général dans mon code.

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

Discussions similaires

  1. Existe-t-il une norme de nomage des packages ?
    Par Pierre8r dans le forum Langage
    Réponses: 3
    Dernier message: 16/08/2007, 23h31
  2. [Lazarus] Test de l'existence des fichiers
    Par Syl_87 dans le forum Lazarus
    Réponses: 3
    Dernier message: 09/08/2007, 11h55
  3. [Classpath][Jar]gestion des packages
    Par marcoss dans le forum Général Java
    Réponses: 4
    Dernier message: 24/04/2004, 22h19
  4. Gestion des packages RPM sous Mandrake
    Par Noki dans le forum Mandriva / Mageia
    Réponses: 10
    Dernier message: 29/03/2004, 19h43
  5. [LG]pour l'existence des fichiers en pascal
    Par mister_dsg dans le forum Langage
    Réponses: 8
    Dernier message: 04/12/2003, 22h14

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