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 :

Signification d'un script linux


Sujet :

Shell et commandes GNU

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 36
    Points : 43
    Points
    43
    Par défaut Signification d'un script linux
    Bonjour,
    je ne connais rien en linux , mais j'ai quand même réussi à compiler fmpeg sous MinGW.
    j'ai modifié les scripts pour générer certaine dll , j'ai un point de blocage :
    voici un script que je ne comprend pas , la commande d'appel et fonction enabled .
    Que fait cette fonction ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    enabled ${name#lib} || return 0
     
     
     enabled(){
        test "${1#!}" = "$1" && op== || op=!=
        eval test "x\$${1#!}" $op "xyes"
     }
    Merci

  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 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par margilb Voir le message
    je ne connais rien en linux , mais j'ai quand même réussi à compiler fmpeg sous MinGW.
    Bonjour

    Bel exploit surtout que MinGW est une bibliothèque d'outils pour Windows et que les dll (dont tu parles plus bas) sont des librairies Windows...

    Citation Envoyé par margilb Voir le message
    Que fait cette fonction ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    enabled ${name#lib} || return 0
     
     
     enabled(){
        test "${1#!}" = "$1" && op== || op=!=
        eval test "x\$${1#!}" $op "xyes"
     }
    La commande d'appel appelle la fonction enabled() en lui passant en paramètre le contenu de la variable "name" à laquelle on supprimera le début de ce contenu celui-ci commence par les caractères "lib". Donc si la variable "name" contient "toto", la fonction recevra "toto" mais si elle contient "libxyzt" alors la fonction recevra "xyzt".
    Si la fonction échoue (le double pipe vertical), cette instruction (qui doit probablement elle-même se trouver dans une fonction) renvoie 0 à son appelant.

    La fonction commence par évaluer la chaine reçue. Si cette chaine à laquelle on otera son premier caractère si celui-ci est un "!" correspond à la chaine elle-même, alors la variable "op" sera remplie avec le caractère "=" sinon elle sera remplie avec les caractères "!=" (il est vrai que si le Rain Man qui a écrit ce script avait mis des double quotes ça aurait été plus clair parce qu'il m'a fallu regarder la ligne suivante pour comprendre celle-ci !!!)
    Ensuite la fonction compare la chaine reçue précédée du caractère "x" avec la chaine "xyes". Mais le comparateur sera soit "=" (égalité) soit "!=" (inégalité) selon le contenu de la variable "op" (opérateur).

    Donc si la fonction reçoit "!toto" ou "toto", dans les deux cas la chaine se verra enlever son premier "!". Alors comme "toto"="toto", l'opérateur sera "=". Et ensuite elle comparera si "xtoto" = "xyes" ce qui est faux.
    Si maintenant la fonction reçoit "!!!toto", comme un seul des "!" sera enlevé et que "!!toto" n'est pas égal à "!!!toto", l'opérateur sera "!=". Et ensuite elle comparera si "x!!toto" != "xyes" ce qui est vrai.
    Si la fonction reçoit "yes" ou "!yes", l'opérateur sera "=" puis la fonction comparera "xyes" = "xyes" ce qui est vrai.
    Et si la fonction reçoit "!!yes", l'opérateur sera "!=" puis la fonction comparera "x!yes" != "xyes" ce qui est encore vrai.

    C'est vrai que c'est pas un script facile à comprendre car il fait appel à beaucoup de notions pas forcément usuelles. On aura
    • l'utilisation de ${var#xyz} qui renvoie le contenu de la variable oté de la chaine "xyz" si la variable commence par cette chaine
    • un opérateur écrit sous forme de variable
    • l'utilisation de eval qui permet de transformer une chaine de caractère (chaine généralement forgée lors de l'exécution à partir de variables diverses) en instruction shell


    PS: le rajout du "x" est une astuce quand on veut comparer des variables éventuellement vides avec des chaines. Comme le test a horreur des opérandes vides qu'il ne sait pas gérer, rajouter un "x" (ou n'importe quoi d'autre) fait que l'opérande n'est plus vide (mais bien entendu il faut rajouter aussi le "x" de l'autre coté pour garder l'égalité éventuelle...)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    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 margilb Voir le message
    Que fait cette fonction ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    enabled ${name#lib} || return 0
     
     enabled(){
        test "${1#!}" = "$1" && op== || op=!=
        eval test "x\$${1#!}" $op "xyes"
     }
    Merci
    Sauf erreur de ma part, si on a:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Option1=yes
    Option2=no
    Option3=yes
    Option4=no
    alors les instructions suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    name=Option1; enabled ${name#lib} || return 0
    name=Option2; enabled ${name#lib} || return 0
    name=libOption3; enabled ${name#lib} || return 0
    name=libOption4; enabled ${name#lib} || return 0
     
    name=!Option2; enabled ${name#lib} || return 0
    name=!Option1; enabled ${name#lib} || return 0
    name=!libOption3; enabled ${name#lib} || return 0
    name=!libOption4; enabled ${name#lib} || return 0
    sont respectivement "équivalentes" à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    [ $Option1 = yes ] || return 0
    [ $Option2 = yes ] || return 0
    [ $Option3 = yes ] || return 0
    [ $Option4 = yes ] || return 0
     
    [ $Option1 != yes ] || return 0
    [ $Option2 != yes ] || return 0
    [ $libOption3 != yes ] || return 0
    [ $libOption4 != yes ] || return 0
    et vont donc faire soit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    rien (continuer l'exécution du script)
    return 0 (arrêter l'exécution du script ou de la fonction courante du script)
    respectivement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    rien
    return 0
    rien
    return 0
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    return 0
    rien
    return 0 # malgré le bug
    return 0 # (bug?)
    L'interprétation douteuse de "!libOption" est surtout gênante dans le dernier cas!

Discussions similaires

  1. Lancer un Script Linux à distance.
    Par tissot dans le forum Administration système
    Réponses: 7
    Dernier message: 21/08/2006, 15h40
  2. Cygwin - script linux
    Par mohamed dans le forum Linux
    Réponses: 2
    Dernier message: 15/08/2006, 16h18
  3. Recuperer infos de la bdd depuis un script linux
    Par siteman dans le forum Linux
    Réponses: 2
    Dernier message: 13/07/2006, 15h00
  4. Question générale sur les scripts linux
    Par jejerome dans le forum Linux
    Réponses: 4
    Dernier message: 09/04/2006, 08h25
  5. Script linux
    Par Bj0 dans le forum Linux
    Réponses: 8
    Dernier message: 23/01/2006, 16h28

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