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 :

Décoder un code


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 083
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 083
    Par défaut Décoder un code
    Bonjour,

    Merci d'avoir la gentillesse de m'expliquer ce que fait la code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    verifliens () {
        for element in $1/*; do
        [ -h "$element" -a ! -e "$element" ] && echo \"$element\"
        [ -d "$element" ] && verifliens $element
        # Bien sûr, '-h' teste les liens symboliques, '-d' les répertoires.
        done
    }
    Ma question est plutôt sur la ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    [ -h "$element" -a ! -e "$element" ] && echo \"$element\"
    Cordialement.

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 651
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    Bonjour,

    quand tu auras lu help test, tu nous proposeras ton interprétation.

    sache, pour l'instant, que ce test est contradictoire. voir le message en-dessous de Flodelarab
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 287
    Par défaut
    Bonjour

    Vraiment ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ ln -s /dev/null titi
    $ ln -s ./fichier_inexistant tata
    $ for i in titi tata;do test -h $i && echo -n "lien $i "; test -e $i && echo valide || echo invalide;done
    lien titi valide
    lien tata invalide

  4. #4
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 651
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    je vois, mais il faut m'expliquer.
    comment un lien peut-il ne pas exister ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 287
    Par défaut
    J'imagine que c'est la question de big1, aussi.

    -h ou -L vérifie la validité du chemin et la nature du fichier sans suivre le moindre lien.

    -e renvoie l'existence du fichier quelque soit sa nature (fichier régulier, pipe, périphérique, etc) sauf dans le cas des liens pour lesquels il renvoie faux en cas de lien brisé.

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    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 102
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    je vois, mais il faut m'expliquer.
    comment un lien peut-il ne pas exister ?
    Un lien physique existe toujours:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ touch fic1
    $ ls -li fic1
    12889157013 -rw-rw-r--  1 jack  wheel  0 28 jan 01:18 fic1
    $ ln fic1 fic2
    $ ls -li fic1 fic2
    12889157013 -rw-rw-r--  2 jack  wheel  0 28 jan 01:18 fic1
    12889157013 -rw-rw-r--  2 jack  wheel  0 28 jan 01:18 fic2$ \rm fic1
    $ ls -li fic1 fic2
    ls: fic1: No such file or directory
    12889157013 -rw-rw-r--  1 jack  wheel  0 28 jan 01:18 fic2
    L'instruction ln fic1 fic2 a créé un fichier "fic2" (chemin absolu ou relatif) avec comme i-node le i-node de "fic1", soit 12889157013 chez moi.
    Les "deux" fichiers sont totalement indiscernables: en réalité, c'est vraiment le même fichier avec 2 noms différents!
    On voit aussi que le 3ème champ passe de 1 à 2 (il indique le nombre de références à cet i-node) puis de 2 à 1 lorsqu'on supprime l'une des références (avec rm).

    Un lien symbolique est une indirection:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $ ln -s fic1 fic3; echo $?
    0   #  => pas d'erreur bien que "fic1" n'existe pas.
    $ ls -li fic1 fic2 fic3
    ls: fic1: No such file or directory
    12889157013 -rw-rw-r--  1 jack  wheel  0 28 jan 01:18 fic2
    12889157188 lrwxrwxr-x  1 jack  wheel  4 28 jan 01:25 fic3@ -> fic1
    $ od -c fic3   # Attention: j'ai un peu triché...
    0000000    f   i   c   1                                            
    0000004
    $ cat fic3
    cat: fic3: No such file or directory
    $ echo coucou > fic1
    $ cat fic3
    coucou
    Attention, j'ai triché afin d'illustrer mon propos!
    Dans le temps, avec d'anciennes versions d'Unix (BSD 4.2 ou 4.3 peut-être), on pouvait effectivement lire le contenu du fichier lien symbolique avec od et constater vraiment qu'il contenait juste le chemin (absolu ou relatif) du fichier référencé (de la même manière qu'on pouvait "lire" un répertoire avec od et voir la liste des noms des fichiers et des i-nodes avec le \0 comme séparateur).

    Actuellement, on peut juste "supputer" que le lien contient le nom du fichier référencé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ ln -s 01234567890123456789 fic4
    $ ls -l fic4
    lrwxrwxr-x  1 jack  wheel  20 28 jan 01:37 fic4@ -> 01234567890123456789
    sinon par quel miracle la taille de "fic4" serait, comme par hasard, exactement de 20 caractères?

  7. #7
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 651
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    d'accord, mais comment un lien peut-il pointer vers un fichier qui n'existe pas ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

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

Discussions similaires

  1. Décoder un code barre
    Par bonsaiko dans le forum Général Conception Web
    Réponses: 3
    Dernier message: 09/11/2016, 10h27
  2. De la rapidité du code
    Par jfloviou dans le forum Contribuez
    Réponses: 233
    Dernier message: 29/05/2009, 02h17
  3. formatage session codée a décoder
    Par poxtra_102 dans le forum Windows XP
    Réponses: 2
    Dernier message: 18/09/2006, 21h32
  4. Explorateur de code C
    Par Zero dans le forum C
    Réponses: 14
    Dernier message: 06/06/2002, 09h41
  5. OmniORB : code sous Windows et Linux
    Par debug dans le forum CORBA
    Réponses: 2
    Dernier message: 30/04/2002, 17h45

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