Le premier composant signifie ici un élément du chemin.Exemple :
/home/user/.ssh => <component1>/<component2>/<component3>
1- Supposons que nous ayons une structure de répertoires comme celle-ci :
lols
├── lol
├── lol1 -> lol
└── lol2 -> lol1
Et aussi le répertoire inexistant ici sera lols/lol3Vous pouvez donc comparer la sortie de chaque commande :
readlink -f lols/lol1 : /lols/lol
readlink -e lols/lol1 : /lols/lol
La sortie ici sera la même car tous les composants du chemin existent.
readlink -f lols/lol8 : lols/lol8
readlink -e lols/lol8 : <empty outpyt>
La sortie ici est différente car avec -f il affichera le résultat car il y a un composant qui existe au moins dans le chemin qui est lols et avec -e la sortie sera vide car tous les composants du chemin doivent exister .
Et le dernier est d'avoir plusieurs répertoires inexistants :
readlink -f lols/lol8/lol10 : <empty output>
readlink -e lols/lol8/lol10 : <empty output>
Ici la sortie sera vide car comme décrit dans la page map :-f :tous les composants sauf le dernier doivent exister => Non respecté-o :tous les composants doivent exister => Non respecté
2- Pourquoi ne pas utiliser uniquement ls -l :
Supposons que nous créons un fichier nommé fichier1 et que nous créons un lien symbolique vers ce fichier nommé lien1 et à partir de lien1 créer un autre lien symbolique lien2 :
touch file1 : file1
ln -s file1 link1 : link1 -> file1
ln -s link1 link2 : link2 -> link1
Puis avec ls -l link2
la sortie sera :lien2 -> lien1Et si nous utilisons readlink link2
la sortie sera :lien1; identique à ls -lMais si nous utilisons readlink -f|-e link2
la sortie sera :fichier1; il pointera donc vers la source fichier.
Alors, quand utiliser readlink au lieu de ls ?Lorsqu'il y a des liens symboliques imbriqués (Lecture récursive). Lorsque les fichiers/répertoires se trouvent à des emplacements différents.
Il vaut donc mieux utiliser readlink au lieu de ls pour éviter les erreurs.
Ceci est significatif pour les liaisons suivant une route sur plus d'un saut jusqu'à leur destination finale. Par exemple :
touch test_file
ln -s test_file test_link
ln -s non_existing_target dead_link
ln -s test_link link1
ln -s dead_link link2
Dans ce qui précède, link1
est enfin lié à un fichier, via test_link
, donc -f
et -e
donnerait le même résultat. link2
pointe vers un lien mort, et vous voyez que :
> readlink -e link2
> readlink -f link2
/home/thanasis/temp/non_existing_target
dead_link
est le "dernier composant" dans l'expression "tous les composants sauf le dernier doivent exister". -f
résout la cible qui n'existe pas, tandis que -e
ne donne aucune sortie.
Notez que man readlink
recommande que
realpath
est la commande préférée à utiliser pour la fonctionnalité de canonisation
Pour cet exemple, realpath -m
, (--missing
) donnerait la même sortie à readlink -f
. En général realpath -e
est le moyen de tester si un lien peut être résolu vers un fichier cible existant final, qui renvoie l'erreur attendue ici :
> realpath -e link2
realpath: link2: No such file or directory
Alors que ls -l
renvoie tous les résultats et a probablement une sortie de couleur rouge pour tous les liens morts. Aussi l'option -L
existe, pour déréférencer les liens et montrer leur cible, c'est pour les humains à lire, n'utilisez jamais ls
pour décider quoi que ce soit sur un lien à l'intérieur d'un script.