Wie man symbolische Links in einem Shell-Skript auflöst
Die Arbeit mit symbolischen Links (oder Symlinks) in Unix-ähnlichen Systemen kann manchmal knifflig sein, insbesondere wenn Sie den tatsächlichen Pfad ermitteln möchten, auf den ein Symlink verweist. Wenn Sie ein Shell-Skript schreiben und den vollständigen Pfad eines Ziels nach dem Auflösen von zwischenzeitlichen Symlinks bestimmen müssen, sind Sie hier genau richtig. In diesem Blog-Beitrag erklären wir, wie Sie dies effizient erreichen können.
Das Problem verstehen
Stellen Sie sich vor, Sie haben eine Situation, in der Sie einen symbolischen Link foo
haben, der auf ein anderes Verzeichnis bar
zeigt. Wenn Sie Befehle wie cd foo
und pwd
ausführen, zeigt Ihre Shell möglicherweise nicht die zugrunde liegende Struktur klar an, was es schwierig macht, den vollständigen Pfad zum Ziel abzuleiten.
Zum Beispiel:
ls -ld foo bar
drwxr-xr-x 2 greg greg 68 Aug 11 22:36 bar
lrwxr-xr-x 1 greg greg 3 Aug 11 22:36 foo -> bar
Wenn Sie folgendes ausführen:
cd foo
pwd
Wäre die Ausgabe einfach /Users/greg/tmp/foo
, was Ihnen nicht viel hilft, wenn Ihr Ziel darin besteht, den tatsächlichen Pfad zu entdecken, auf den foo
zeigt, nämlich /Users/greg/tmp/bar
.
Die Lösung
Glücklicherweise gibt es integrierte Befehle, die Ihnen helfen können, Symlinks in einem Shell-Skript aufzulösen, ohne in die C-Programmierung eintauchen zu müssen. So geht’s:
Verwendung des pwd
-Befehls
Der Befehl pwd -P
wird verwendet, um das aktuelle Arbeitsverzeichnis auszugeben und alle Symlinks aufzulösen, um den absoluten Pfad des Ziels bereitzustellen. Wenn Sie ausführen:
pwd -P
Wird der vollständige Pfad nach dem Auflösen von Symlinks zurückgegeben.
Verwendung von getcwd
Eine andere Möglichkeit, dies zu erreichen, besteht darin, die Funktion getcwd
aus der Bibliothek unistd.h
in C zu nutzen. Wenn Sie jedoch ein Skript schreiben, können Sie stattdessen auf Shell-Befehle zurückgreifen. Es ist eine gute Praxis zu wissen, dass getcwd
ein ähnliches Verhalten wie pwd -P
hat.
Erstellen der Auflösungsfunktion
Sie können diese Befehle in eine Funktion einfügen, um Ihre Arbeit zu erleichtern. Hier ist ein Beispiel für eine einfache resolve
-Funktion in einer Bash-Shell:
resolve() {
# Verwenden Sie den angegebenen Pfad und lösen Sie ihn auf
local target=$1
# `readlink -f` folgt Symlinks und gibt den vollständigen Pfad zurück
local full_path=$(readlink -f "$target")
echo "$full_path"
}
Beispielverwendung
Rufen Sie jetzt die Funktion einfach mit:
resolve "foo"
Dies gibt zurück:
/Users/greg/tmp/bar
Dieses Muster ermöglicht es Ihnen, den vollständigen Pfad jedes Symlinks, auf den Sie in Ihrer Shell-Skriptumgebung gestoßen sind, zu erhalten.
Bonus: Auflösen von Benutzer-Home-Pfaden
Wenn Sie auch Home-Verzeichnisse mithilfe der Tilde-Notation (wie ~benutzername
) auflösen möchten, erweitert Bash diese Pfade automatisch in einem Shell-Skript, sodass Sie dies nahtlos mit Ihrer resolve
-Funktion kombinieren können.
Fazit
Das Auflösen von symbolischen Links in Shell-Skripten muss nicht kompliziert sein. Durch die Nutzung des pwd -P
-Befehls oder das Erstellen einer Hilfsfunktion wie resolve
, die readlink
verwendet, können Sie effektiv den vollständigen Pfad zu Ihrem Ziel bestimmen. Diese Fähigkeit ist für jeden, der in einer Unix-ähnlichen Umgebung arbeitet, unerlässlich und macht Ihre Skripte robuster und informativ.
Denken Sie daran, dass eine gute Verwaltung von Symlinks Ihnen Zeit und Verwirrung ersparen kann, während Sie durch Verzeichnisstrukturen navigieren oder komplexe Shell-Skripte schreiben.