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.