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 :

[shell]telecharger et vérifier l'install


Sujet :

Linux

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3
    Points : 2
    Points
    2
    Par défaut [shell]telecharger et vérifier l'install
    bonjour,

    Je suis débutant en linux.
    Je voudrais faire un script qui télécharge un fichier et qui le décompresse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    INST_DIR="/mnt/gentoo"
     
    sudo mkdir $INST_DIR
    cd $INST_DIR
     
    # téléchargement des fichiers
    sudo wget ftp://ftp.free.fr/mirrors/ftp.gentoo.org/releases/amd64/current/stages/stage3-amd64-2008.0.tar.bz2
    sudo wget ftp://ftp.free.fr/mirrors/ftp.gentoo.org/releases/amd64/current/stages/stage3-amd64-2008.0.tar.bz2.DIGESTS
    md5sum -c stage3-amd64-2008.0.tar.bz2.DIGESTS
    sha1sum -c stage3-amd64-2008.0.tar.bz2.DIGESTS
    sudo tar xjvfp stage3-amd64-2008.0.tar.bz2
    => comment faire des test d'erreurs (savoir si tout c'est bien passé et aiguiller sur une autre partie du programme si une erreur est apparue) ?

    => aussi, je voudrais savoir si les fichiers ont déjà été téléchargés et décompressés de façon que lorsque je relance le script, je ne refasse pas les étapes déjà effectuées

  2. #2
    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 043
    Points
    31 043
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par cmarmonier Voir le message
    bonjour,

    Je suis débutant en linux.
    Je voudrais faire un script qui télécharge un fichier et qui le décompresse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    INST_DIR="/mnt/gentoo"
     
    sudo mkdir $INST_DIR
    cd $INST_DIR
     
    # téléchargement des fichiers
    sudo wget ftp://ftp.free.fr/mirrors/ftp.gentoo.org/releases/amd64/current/stages/stage3-amd64-2008.0.tar.bz2
    sudo wget ftp://ftp.free.fr/mirrors/ftp.gentoo.org/releases/amd64/current/stages/stage3-amd64-2008.0.tar.bz2.DIGESTS
    md5sum -c stage3-amd64-2008.0.tar.bz2.DIGESTS
    sha1sum -c stage3-amd64-2008.0.tar.bz2.DIGESTS
    sudo tar xjvfp stage3-amd64-2008.0.tar.bz2
    C'est plus du domaine de l'algorithmie pure que du Linux ce que tu demandes car dans tous les langages de prog on retrouve tes problèmes.

    Citation Envoyé par cmarmonier Voir le message
    => comment faire des test d'erreurs (savoir si tout c'est bien passé et aiguiller sur une autre partie du programme si une erreur est apparue) ?
    En shell, un test d'erreur se fait grace à la variable "$?". Après chaque commande, cette variable récupère le statut (le code retour) de la commande. Et conventionnellement, ce code retour est à 0 si la commande s'est bien exécutée et à un autre chiffre dans le cas contraire (on considère que si la commande s'est bien exécutée, elle est "vraie" et "faux" dans le cas contraire)

    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    rm .
    echo $?     # Comme tu peux pas effacer le répertoire ".", tu peux être certain que t'auras pas 0
    Autre exemple: puisque toute commande est vraie/fausse, tu peux la tester dans une alternative if then/else
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if rm .
    then
         echo "L'effacement s'est bien passé
    else
        echo "Il y a eu un problème"
    fi
    Concernant l'aiguillage, c'est rarement la peine de le faire. Si une erreur apparait, on affiche un message d'erreur et on arrête le script car ça vaut pas la peine de continuer. C'est ce qu'il y a de plus simple à programmer
    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
    #!/bin/sh
    if <condition 1 pas ok>
    then
        echo "Problème à la condition 1"
        exit 1
    fi
     
    if <condition 2 pas ok>
    then
        echo "Problème à la condition 2"
        exit 2
    fi
     
    if <condition 3 pas ok>
    then
        echo "Problème à la condition 3"
        exit 3
    fi
    etc...
     
    # A partir de ce point, tout est ok donc le script peut bosser
    <.... travail ...>
     
    # Fin du script - Tout s'est bien passé
    exit 0
    Citation Envoyé par cmarmonier Voir le message
    => aussi, je voudrais savoir si les fichiers ont déjà été téléchargés et décompressés de façon que lorsque je relance le script, je ne refasse pas les étapes déjà effectuées
    Alors faut inscrire chaque étape dans un fichier texte. Lorsque le script démarre, il commence par lire le fichier texte pour voir où il en est mais là encore c'est rarement utile. Ca peut devenir assez fastidieux à programmer (faut penser à plein de cas possibles) et le gain de temps final ne vaut pas vraiment le coup (rares sont les fois où le script se déroule mal et si ça arrive une fois ben on recommence tout le processus)

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    ok merci pour les reponses

    Alors faut inscrire chaque étape dans un fichier texte. Lorsque le script démarre, il commence par lire le fichier texte pour voir où il en est mais là encore c'est rarement utile. Ca peut devenir assez fastidieux à programmer (faut penser à plein de cas possibles) et le gain de temps final ne vaut pas vraiment le coup (rares sont les fois où le script se déroule mal et si ça arrive une fois ben on recommence tout le processus)
    =>ok, je vais abandonner cette etape. Par contre je veux juste faire un truc : c'est tester si mes fichiers tar sont sur mon disque dur au démarrage. Comment on fait ?

    je ne comprends pas pourquoi ça ne marche pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if [ "sudo cp ./ltiti.sh /toto/" ]
    then
    echo -e "${RED}Erreur copy du fichier{OFF}"
    exit
    fi
    ça copie le fichier mais j'ai toujours le message d'erreur

  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 043
    Points
    31 043
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par cmarmonier Voir le message
    ok merci pour les reponses

    =>ok, je vais abandonner cette etape. Par contre je veux juste faire un truc : c'est tester si mes fichiers tar sont sur mon disque dur au démarrage. Comment on fait ?
    Pour vérifier les caractéristiques d'un fichier, faut regarder du coté de test
    test -f fic => vérifie que le fichier est de type "file"
    test -d fic => vérifie que le fichier est de type "dir"
    test -s fic => vérifie que le fichier n'est pas vide
    test -l fic => vérifie que le fichier est de type "link"
    etc (man test ou man bash pour plus d'options)

    La commande test -e fic vérifie la simple existence d'un fichier mais cette option n'est pas présente sur tous les shells (uniquement bash et shells plus récents) mais si on n'a pas la chance d'être sur un shell récent, on peut la remplacer par un "ls" (si le "ls" échoue, cela veut dire que le fichier n'existe pas)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    test -e fic && echo fic existe || echo "fic n'existe pas"
    ls -d fic 1>/dev/null 2>&1 && echo fic existe || echo "fic n'existe pas"
    Citation Envoyé par cmarmonier Voir le message
    je ne comprends pas pourquoi ça ne marche pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if [ "sudo cp ./ltiti.sh /toto/" ]
    then
    echo -e "${RED}Erreur copy du fichier{OFF}"
    exit
    fi
    Parce que t'as pas bien compris comment marchait un contrôle if/while/until

    L'alternative "if" permet de tester la validité non pas d'une égalité (comme dans d'autres langages comme le C, le php ou le Python) mais d'une commande. Car la base du shell est d'appeler des commandes et chaque commande renvoie un état vrai/faux.
    Dans la plupart des cas, on ne regarde jamais cet état. On appelle les commandes les unes après les autres. Mais il est possible de le faire. Dans le post précédent, j'ai tapé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if rm .
    then
       ...
    fi
    Ca signifie littéralement "si la commande rm renvoie vraie (donc s'est bien exécutée), alors ..."

    Donc un if ou un while/until ne peuvent contrôler que des commandes. Et si on veut contrôler des expressions logiques, on passe par la commande "test" qui contrôle l'expression reçu et renvoie elle-même vrai/faux
    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if test "$HOME" = "/home/machin"
    then
        ...
    fi
    Ici on demande à la commande "test" de contrôler une égalité de chaines et de renvoyer vrai/faux suivant le résultat de la comparaison. Et le "if" reste ce qu'il est à l'origine => un simple contrôle de la commande invoquée (ici "test").

    On trouve donc en majorité des tests après des if/while/until car les programmeurs ont en majorité besoin de vérifier des variables mais ce n'est pas une obligation => voir mon "if rm". De plus, la commande "test machin" peut s'écrire aussi "[ machin ]".

    Donc en lisant ton code, on lit
    if test sudo cp ...
    ce qui se traduit par
    si la commande "test" évalue l'expression booléenne sudo cp ... à "vrai", alors...
    Il est fortement probable que la commande "test" interprète la chaine "sudo cp ..." comme booléennement vraie. De plus, ce code ne traduit pas ton désir qui était, je pense, "si la commande sudo s'exécute correctement alors..."

    Un tel ordre a deux façons se traduit en shell
    1) exécuter la commande et regarder son code retour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    sudo cp ./ltiti.sh /toto/
    if test $? -ne 0
    then
        echo -e "${RED}Erreur copy du fichier{OFF}"
        exit
    fi
    2) tester directement la réussite de la commande (ou plutôt, dans ton cas particulier, l'échec de la commande)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if sudo cp ./ltiti.sh /toto/
    then
        true            # Instruction neutre mais obligatoire car il faut toujours une instruction dans le then
    else
        echo -e "${RED}Erreur copy du fichier{OFF}"
        exit
    fi
    Petit danger cependant => ce mécanisme marche parfaitement pour une simple commande mais toi, tu demandes à la commande sudo d'appeler la commande cp donc cela fait un enchainement de deux commandes imbriquées. Si le cp échoue, je ne sais pas comment réagit le shell mais en toute logique, comme le sudo lui aura réussi, je pense que t'auras jamais de retour en échec...

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    ok merci pour toutes ces infos : félicitation c'était très complet

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

Discussions similaires

  1. Vérifier l'installation de XMLParser
    Par Dave Lopeur dans le forum Oracle
    Réponses: 2
    Dernier message: 03/05/2011, 11h58
  2. Vérifier et installer une bdd mysql
    Par Invité dans le forum VB.NET
    Réponses: 2
    Dernier message: 01/11/2010, 15h33
  3. [SHELL] Debian Lenny - Apache 2 - Installation Subversion
    Par hornetbzz dans le forum Contribuez
    Réponses: 0
    Dernier message: 25/05/2010, 01h11
  4. Vérifier l'installation d'un module
    Par RemiBousquet dans le forum Administration et Installation
    Réponses: 7
    Dernier message: 16/10/2009, 15h52

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