Linux / Befehl readlink: Symbolische Linkziele überprüfen
readlink ist ein Befehl, der den Zielpfad ausgibt, der in einer symbolischen Linkdatei gespeichert ist. Er ist nützlich, um zu überprüfen, ob der Link einen relativen Pfad enthält oder wohin ein defekter Link zeigt.
GNU readlink unterstützt auch die Pfadnormalisierung mit -f, -e und -m, aber GNU Coreutils empfiehlt, für die allgemeine Pfadnormalisierung realpath zu verwenden, da dieser klarere Funktionen und Benennungen hat.
Ergänzende Befehle und Anwendungsfälle finden Sie in Linux / Befehle / stat - Dateiinformationen und Metadaten überprüfen und Liste der häufig verwendeten Befehle in Linux.
Was ist der Befehl readlink?
Wenn Sie einen symbolischen Link als Argument angeben, gibt er die im Link gespeicherte Zielzeichenkette aus.
readlink current
Wenn der current-Link auf releases/2026-09 zeigt, wird er wie folgt ausgegeben.
releases/2026-09
Dieser Wert kann ein relativer Pfad sein, der basierend auf dem Speicherort des Links interpretiert wird. Der Standard readlink zeigt ihn in der Nähe der gespeicherten Form, ohne den Zielstring in einen absoluten Pfad umzuwandeln.
Grundlegende Syntax und Verwendung
readlink [options] file...
Sie können zuerst einen Beispiel-Link mit ln -s erstellen und ihn dann prüfen.
ln -s releases/2026-09 current readlink current
Wenn Sie eine reguläre Datei oder ein Verzeichnis ohne Optionen angeben, gibt es keinen Linkzielwert, sodass nichts ausgegeben wird, und es schlägt mit einem Nicht-Null-Exit-Status fehl.
readlink /etc/passwd printf '%s\n' "$?"
Verständnis von relativen und absoluten Links
Link, der einen relativen Pfad speichert
Das Ziel eines relativen Links wird basierend auf dem Verzeichnis, in dem der Link platziert ist, und nicht auf dem aktuellen Terminalstandort interpretiert.
ln -s ../shared/config.yml /srv/app/config.yml readlink /srv/app/config.yml
Die Ausgabe ist ../shared/config.yml. Dieser Pfad wird relativ zu /srv/app aufgelöst und zeigt auf /srv/shared/config.yml.
Link, der einen absoluten Pfad speichert
ln -s /srv/releases/2026-09 /srv/current readlink /srv/current
Ein absoluter Link gibt die Zielzeichenfolge aus, beginnend vom Root, so:
/srv/releases/2026-09
Absolute Links haben einen klaren Standort, können jedoch leicht brechen, wenn der Dateibaum an einen anderen Pfad verschoben wird. Wählen Sie relative oder absolute Links unter Berücksichtigung Ihrer Bereitstellungsstruktur und Portabilität.
Überprüfung gebrochener symbolischer Links
Selbst wenn die Zieldatei nicht existiert, kann die Basis readlink die gespeicherte Zielzeichenfolge lesen, solange der symbolische Link selbst erhalten bleibt.
ln -s missing-target broken-link readlink broken-link
missing-target
Die Existenz des Linkziels kann separat wie folgt überprüft werden.
if [ -L broken-link ] && [ ! -e broken-link ]; then printf '%s\n' 'This is a broken symbolic link.' fi
-L überprüft die Existenz des Links selbst, während -e die Existenz des Ziels überprüft, auf das er zeigt. Berechtigungsprobleme oder Link-Zyklen können ebenfalls das Ergebnis beeinflussen.
Pfad-Normalisierungsoptionen
GNU readlink bietet auch einen Modus zum Normalisieren von Pfaden zusätzlich zur Ausgabe des Linkzielstrings.
| Option | Aktion |
|---|---|
-f, --canonicalize |
Alle Pfadkomponenten außer der letzten müssen existieren, und symbolische Links sowie Punktkomponenten werden aufgelöst. |
-e, --canonicalize-existing |
Alle Komponenten einschließlich des letzten Elements müssen existieren. |
-m, --canonicalize-missing |
Nicht existente Komponenten werden ebenfalls als Verzeichnisse angenommen, um den Pfad zu normalisieren. |
Drucke einen kanonischen Pfad mit -f
readlink -f /srv/current/config.yml
Gibt den absoluten Pfad aus, wobei symbolische Links und ., .. aufgelöst werden. Die letzte Komponente kann fehlen, aber die vorhergehenden Komponenten müssen existieren.
Erfordert, dass jede Komponente mit -e existiert
readlink -e /srv/current/config.yml
Der gesamte Pfad, einschließlich der Zieldatei, muss existieren, damit das Ergebnis ausgegeben wird. Es verhindert keine Race-Bedingung, bei der sich das Ziel zwischen der Existenzprüfung und der tatsächlichen Verwendung ändert.
Fehlende Komponenten mit -m zulassen
readlink -m /srv/future/../uploads/new-file.txt
Behandelt Zwischenkomponenten, die nicht existieren, sodass es für die Pfadplanung oder Zeichenfolgenanordnung verwendet werden kann. Es gibt keine Garantie, dass der ausgegebene Ort tatsächlich erstellt werden kann.
Handhabung mehrerer Links und Trennung der Ausgabe
Mehrere symbolische Links überprüfen
GNU readlink kann mehrere Links gleichzeitig verarbeiten.
readlink current previous config-link
Jeder Zielstring wird zeilenweise ausgegeben. Wenn die Zuordnung zwischen Eingabe und Ausgabe wichtig ist, ist es übersichtlicher, den Linknamen zusammen mit dem Ergebnis in einer Schleife anzuzeigen.
for link in current previous config-link; do target=$(readlink -- "$link") || continue printf '%s -> %s\n' "$link" "$target" done
Der Unterschied zwischen -n und -z
-n oder --no-newline lässt das abschließende Trennzeichen beim Verarbeiten eines einzelnen Links weg. Die Verwendung mit mehreren Dateien kann Warnungen erzeugen.
readlink -n current
-z oder --zero gibt ein NUL-Zeichen anstelle eines Zeilenumbruchs am Ende jedes Ergebnisses aus. In der Automatisierung, bei der Dateinamen und Linkziele möglicherweise Zeilenumbrüche enthalten, ist -z klarer.
readlink -z current previous
Vergleich von readlink, realpath, ls und stat
| Befehl | Hauptzweck | Funktionen |
|---|---|---|
readlink |
Überprüfen Sie die im Link gespeicherte Zielzeichenkette | Sogar defekte Links können als der Link selbst gelesen werden |
realpath |
Dateinamen-Normalisierung und Berechnung relativer Pfade | GNU wird hauptsächlich für die Pfadnormalisierung empfohlen |
ls -l |
Überprüfen Sie Links und Ziele in der Liste auf eine für Menschen leicht lesbare Weise | Zusammen mit anderen Listeninformationen angezeigt, wodurch es sich nicht zum Parsen eignet |
stat |
Detaillierte Metadaten des Links oder Ziels überprüfen | Sie können Inode, Berechtigungen, Zeit und Dateityp überprüfen |
Wenn nur die Zielzeichenfolge des Links in der Automatisierung benötigt wird, ist readlink geeignet. Wenn der Zweck die allgemeine Pfadnormalisierung und die Umwandlung relativer Pfade ist, ist realpath klarer.
Verwendung in Shell-Skripten
Überprüfen Sie, ob das Linkziel ein relativer Pfad ist
target=$(readlink -- "$link") || {
printf '%s\n' 'Cannot read the symbolic link.' >&2
exit 1
}
case "$target" in
/*) printf '%s\n' 'This is an absolute path link.';;
*) printf '%s\n' 'This is a relative path link.';;
esac
Um einen relativen Pfad zu seinem tatsächlichen Speicherort zu berechnen, sollte es auf dem Verzeichnis basieren, das den Link enthält. Es einfach zum aktuellen Arbeitsverzeichnis hinzuzufügen, kann zu einem falschen Pfad führen.
Überprüfen Sie den Exit-Status
Überprüfen Sie, ob der Befehl erfolgreich war, anstatt nur zu prüfen, ob die Ausgabe leer ist. Während das Linkziel nicht eine leere Zeichenfolge sein kann, drückt dies die Absicht der Fehlerbehandlung klarer aus.
if target=$(readlink -- "$link"); then printf '%s\n' "$target" else printf 'Failed to read the link: %s\n' "$link" >&2 fi
Zusammenfassung der wichtigsten Optionen
| Option | Beschreibung |
|---|---|
-f, --canonicalize |
Normalisiere den Pfad, dessen Komponenten existieren, mit Ausnahme des letzten Elements. |
-e, --canonicalize-existing |
Alle Pfadkomponenten müssen für den Erfolg existieren. |
-m, --canonicalize-missing |
Behandle nicht existierende Komponenten als Verzeichnisse. |
-n, --no-newline |
Lasse den Ausgabe-Trennzeichen nach einem einzelnen Ergebnis weg. |
-z, --zero |
Beende jedes Ergebnis mit einem NUL-Zeichen. |
-q, -s, --quiet |
Unterdrückt die meisten Fehlermeldungen. |
-v, --verbose |
Zeigt Fehlermeldungen an. |
Häufige Probleme
Schlägt ohne jegliche Ausgabe fehl.
Im Standardmodus ist der angegebene Pfad möglicherweise kein symbolischer Link oder der Link selbst ist nicht zugänglich. Prüfen Sie den Exit-Status und lassen Sie mit -v Fehlermeldungen anzeigen.
Das relative Linkziel scheint inkorrekt zu sein.
Der Ausgabepfad relativ sollte basierend auf dem Verzeichnis interpretiert werden, das den Link enthält. Er basiert nicht auf dem aktuellen Verzeichnis, von dem aus der Befehl ausgeführt wird.
readlink -f funktioniert auf anderen Systemen nicht.
Normalisierungsoptionen, einschließlich -f, weisen Implementierungsunterschiede auf. In Skripten, die Portabilität erfordern, überprüfen Sie, ob das Zielbetriebssystem dies unterstützt, und vergleichen Sie, falls Ihr Ziel die Pfadnormalisierung ist, auch verfügbare realpath-Implementierungen und Optionen.
FAQ
Liest readlink den Inhalt der Datei, auf die ein symbolischer Link zeigt?
Nein. Im Standardmodus gibt es die Zielpfadzeichenkette aus, die in der Linkdatei gespeichert ist. Es liest nicht den Inhalt der Zieldatei.
Können auch defekte symbolische Links mit readlink überprüft werden?
Wenn der Link selbst existiert und gelesen werden kann, können Sie die gespeicherte Zielzeichenkette mit dem Standard readlink überprüfen. Die -e-Normalisierung gelingt nur, wenn das tatsächliche Ziel existiert.
Relative Pfade werden ausgegeben. Wie kann ich den absoluten Pfad überprüfen?
In einer GNU-Umgebung können Sie readlink -f link verwenden, aber für allgemeine Pfadnormalisierung ist die Verwendung von realpath in Bezug auf Funktionalität und Absicht klarer.
Warum readlink anstelle von ls -l verwenden?
ls -l ist für menschenlesbare Listen geeignet, während readlink nur die Zielzeichenkette ausgibt, was es für Skripte praktisch macht. In der Automatisierung sollte außerdem auf den Exit-Status und die Trennung von Dateinamen geachtet werden.
Weitere Angaben zu Syntax, Implementierung und Verfügbarkeit finden Sie unter GNU Coreutils readlink offizielle Dokumentation und GNU Coreutils realpath Offizielle Dokumentation.




