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.