it-swarm.com.de

Zu viele Ebenen symbolischer Links

Ich habe diese Dateistruktur erstellt:

test/src
test/firefox

Wenn ich diesen Befehl ausführe:

ln -s test/src test/firefox

Ich würde erwarten, dass ein symbolischer Link test/firefox/src Erstellt wird, der auf test/src Zeigt, aber ich erhalte stattdessen diesen Fehler:

-bash: cd: src: Too many levels of symbolic links
  • Was mache ich falsch?
  • Können Sie keinen symbolischen Link zu einem Ordner erstellen, der in einem Geschwister dieses Ordners gespeichert ist?
  • Was ist der Sinn davon?
111
David Zorychta

An der Oberfläche funktioniert das, was Sie vorgeschlagen haben, für mich.

Beispiel

$ mkdir -p test/src test/firefox

$ tree --noreport -fp
.
`-- [drwxrwxr-x]  ./test
    |-- [drwxrwxr-x]  ./test/firefox
    `-- [drwxrwxr-x]  ./test/src

Machen Sie den symbolischen Link :

$ ln -s test/src test/firefox

$ tree --noreport -fp
.
`-- [drwxrwxr-x]  ./test
    |-- [drwxrwxr-x]  ./test/firefox
    |   `-- [lrwxrwxrwx]  ./test/firefox/src -> test/src
    `-- [drwxrwxr-x]  ./test/src

Ein zweites Ausführen würde normalerweise Folgendes bewirken:

$ ln -s test/src test/firefox
ln: failed to create symbolic link ‘test/firefox/src’: File exists

Wahrscheinlich ist hier noch etwas los. Ich würde vermuten, dass Sie einen Zirkelverweis haben, bei dem ein Link auf sich selbst zurückweist.

Sie können find verwenden, um dies ein wenig herauszufinden:

$ cd /suspected/directory
$ find -L ./ -mindepth 15
35
slm

Wie Dubu in einem Kommentar hervorhebt, liegt das Problem in Ihren relativen Pfaden. Ich hatte ein ähnliches Problem beim Verknüpfen meiner Nginx-Konfiguration mit /usr/local/etc/nginx bis /etc/nginx. Wenn Sie Ihren Symlink folgendermaßen erstellen:

cd /usr/local/etc
ln -s nginx/ /etc/nginx

Sie werden tatsächlich den Link/etc/nginx ->/etc/nginx erstellen, da der Quellpfad relativ zum Pfad des Links ist. Die Lösung ist so einfach wie die Verwendung absoluter Pfade:

ln -s /usr/local/etc/nginx /etc/nginx
185
Steen Schütt

Symlinks beziehen sich auf das übergeordnete Verzeichnis des Links und nicht auf das aktuelle Verzeichnis des Prozesses ln.

Wenn Sie das tun:

cd /top/dir
ln -s test/src test/firefox

(wobei test/firefox ein Verzeichnis ist), erstellen Sie einen Symlink test/firefox/src, dessen Ziel test/src ist.

Das test/src Ist relativ zum Verzeichnis test/firefox, Das ist also ein Symlink zu /top/dir/test/firefox/test/src.

Wenn Sie möchten, dass dieser Symlink ein Link zu /top/dir/test/src Ist, müssen Sie Folgendes schreiben:

ln -s ../src test/firefox/

Oder

ln -s /top/dir/test/src test/firefox/

im Allgemeinen ist es jedoch eine schlechte Idee, Symlinks zu absoluten Pfaden zu erstellen, da diese leicht beschädigt werden können, wenn Verzeichnisse umbenannt oder Dateisysteme an anderer Stelle bereitgestellt werden.

Mit GNU ln können Sie die Option -r Verwenden, um die Berechnung selbst durchzuführen:

$ ln -rs test/src test/firefox/
$ ls -ld test/firefox/src
lrwxrwxrwx 1 chazelas chazelas 6 Nov 29 15:59 test/firefox/src -> ../src
9

Verwenden Sie den absoluten Pfad anstelle des relativen Pfads, dann funktioniert es.

Z.B:

ln -s /home/user/test/src /home/user/test/firefox
6
JISHNU T U

Die Antwort ist, den absoluten Pfad zu verwenden. Es kann jedoch ärgerlich sein, den vollständigen Pfad für etwas einzugeben, das sich im aktuellen Verzeichnis befindet. Sie können die Befehlsersetzung von pwd verwenden, um dies zu vermeiden. Wenn sich Ihr Ziel im aktuellen Verzeichnis befindet:

ln -s "$(pwd)"/target abs/path/to/link 

Wenn sich Ihr Link im aktuellen Verzeichnis befinden sollte:

ln -s /abs/path/to/target "$(pwd)"
1
breadnbeer