GNU/Linux >> Tutoriels Linux >  >> Linux

readlink -f et -e la description des options n'est pas claire

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.


Linux
  1. $var Vs ${var} Et citer ou ne pas citer ?

  2. Que signifie connecter Stdout et Stdin ?

  3. Rediriger et canaliser la sortie ?

  4. 7 Exemples d'opérateurs Linux Grep OR, Grep AND, Grep NOT

  5. tmux :se bloque et ne se charge pas, et ne répond à aucune commande d'option

Pourquoi "effacer" ne pas effacer tout l'écran ?

Pourquoi est-ce Rm -rf et non Rmdir -rf ?

Comment effacer l'historique de Bash sous Linux et Mac

Comment rediriger la sortie vers un fichier et stdout

rsync et liens symboliques

comment faire en sorte que moins de téléavertisseur réponde à la molette de défilement et n'efface pas l'écran