Die erste Komponente bedeutet hier ein Element des Pfads.Beispiel:
/home/user/.ssh => <component1>/<component2>/<component3>
1- Angenommen, wir haben eine Verzeichnisstruktur wie diese:
lols
├── lol
├── lol1 -> lol
└── lol2 -> lol1
Und auch das nicht vorhandene Verzeichnis hier wird lols/lol3 sein. So können Sie die Ausgabe jedes Befehls vergleichen:
readlink -f lols/lol1 : /lols/lol
readlink -e lols/lol1 : /lols/lol
Die Ausgabe hier ist dieselbe, da alle Komponenten des Pfads vorhanden sind.
readlink -f lols/lol8 : lols/lol8
readlink -e lols/lol8 : <empty outpyt>
Die Ausgabe hier ist anders, weil mit -f das Ergebnis wird angezeigt, weil es eine Komponente gibt das gibt es mindestens in dem Pfad, der lols ist und mit -e die Ausgabe ist leer, da alle Pfadkomponenten vorhanden sein müssen .
Und der letzte ist, mehrere nicht existierende Verzeichnisse zu haben:
readlink -f lols/lol8/lol10 : <empty output>
readlink -e lols/lol8/lol10 : <empty output>
Hier ist die Ausgabe leer, da wie auf der Kartenseite beschrieben :-f :alle Komponenten bis auf die letzte vorhanden sein müssen => nicht berücksichtigt-o :alle Komponenten vorhanden sein müssen => nicht berücksichtigt
2- Warum nicht nur ls -l :
verwendenAngenommen, wir erstellen eine Datei namens file1 und erstellen einen asymlink zu dieser Datei namens link1 und erstellen aus link1 einen weiteren symbolischen Link link2 :
touch file1 : file1
ln -s file1 link1 : link1 -> file1
ln -s link1 link2 : link2 -> link1
Dann mit ls -l link2
Die Ausgabe lautet:link2 -> link1Und wenn wir readlink link2
verwenden die Ausgabe wird sein:link1; dasselbe wie ls -lAber wenn wir readlink -f|-e link2
verwenden die Ausgabe wird sein:file1; es zeigt also auf die Quelle Datei.
Wann sollte man also readlink verwenden? statt ls ?Wenn es einen verschachtelten symlink gibt (Rekursives Lesen). Wenn sich die Dateien/Verzeichnisse an unterschiedlichen Orten befinden.
Verwenden Sie also besser readlink statt ls um Fehler zu vermeiden.
Dies ist sinnvoll für Links, die einer Route über mehr als einen Hop bis zu ihrem endgültigen Ziel folgen. Zum Beispiel:
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
Oben link1
schließlich eine Verknüpfung zu einer Datei durch test_link
, also -f
und -e
würde das gleiche Ergebnis liefern. link2
zeigt auf einen toten Link, und Sie sehen Folgendes:
> readlink -e link2
> readlink -f link2
/home/thanasis/temp/non_existing_target
dead_link
ist die "letzte Komponente" im Ausdruck "alle außer der letzten Komponente müssen vorhanden sein". -f
wird in das Ziel aufgelöst, das nicht existiert, während -e
gibt keine Ausgabe.
Beachten Sie, dass man readlink
empfiehlt das
realpath
ist der bevorzugte Befehl für die Kanonisierungsfunktion
Für dieses Beispiel realpath -m
, (--missing
) würde dieselbe Ausgabe für readlink -f
liefern . Allgemein realpath -e
ist die Möglichkeit zu testen, ob ein Link zu einer endgültig vorhandenen Zieldatei aufgelöst werden kann, die hier den erwarteten Fehler zurückgibt:
> realpath -e link2
realpath: link2: No such file or directory
Während ls -l
gibt alle Ergebnisse zurück und hat wahrscheinlich eine rote Farbausgabe für alle toten Links. Ebenso die Option -L
existiert, um die Links zu dereferenzieren und ihr Ziel anzuzeigen, dies ist für Menschen zu lesen, verwenden Sie niemals ls
irgendetwas über einen Link innerhalb eines Skripts zu entscheiden.