Ich habe folgende Dateistruktur:
build/
client/
–> index.js
Und wenn ich versuche, einen symbolischen Link mit dem Namen "client" innerhalb des Build-Verzeichnisses zu erstellen, der auf das Client-Verzeichnis im CWD verweist, sieht das so aus
// Fails
$ pwd
/home/user/
$ ln -s client build/client
$ stat build/client/index.js
stat: build/client/index.js: stat: Too many levels of symbolic links
Ich erhalte den oben angezeigten ELOOP-Fehler. Wenn ich den Zielpfad so ändere, dass er relativ zum Zielpfad ist, ist alles in Ordnung:
// Works
$ pwd
/home/user/
$ ln -s ../client build/client
$ stat build/client/index.js
stat: <outputs file stats>
Ist dies das beabsichtigte Verhalten und erklären Sie bitte, warum ...
Antworten:
Für denjenigen, der nicht funktioniert, erhalten wir, wenn wir das
ls -l
Ergebnis betrachten, Folgendes:Nun zu verstehen, was hier los ist. Schauen wir uns den Befehl an, den Sie aufgerufen haben:
Laut Manpage gibt es zwei mögliche Übereinstimmungen für dieses Format
Es stimmt mit dem ersten Formular überein (seit dem ersten). Nun kann der "Zielname" oder
client
in Ihrem Fall (gemäß dem vollständigenln
Handbuch) beliebige Zeichenfolgen sein. Sie müssen sich im Moment zu nichts entschließen, können sich aber zu etwas in der Zukunft entschließen. Was Sie mit Ihrem Aufruf erstellen, ist ein "baumelnder Symlink", und das System hindert Sie nicht daran, diese zu erstellen.Nun ist Ihr zweiter Aufruf ein
ln -s ../client build/client
sogenannter "relativer Symlink" (wie Sie in Ihrem eigenen Beitrag vermerkt haben). Es gibt einen zweiten Typ, und das ist ein "absoluter Symlink", der beim Ausführen aufgerufen würdeln -s /home/user/client build/client
.Dies ist kein Fehler. Nach dem Handbuch heißt es:
Das heißt, Sie MÜSSEN entweder den relativen oder den absoluten Pfad zum Ziel verwenden.
quelle
Dies ist in der Tat das beabsichtigte Verhalten. Von der
ln(1)
Manpage:Stellen Sie sich vor, der Symlink würde stattdessen relativ zu seiner Quelle und nicht zu seinem Ziel interpretiert. Wenn Sie es später beheben möchten, müssen Sie wissen, wie Ihre CWD bei der Erstellung aussah. Dies ist unsinnig, geschweige denn unmöglich.
Darüber hinaus erhalten Sie auf diese Weise eine übersichtliche und kompakte Methode zum Erstellen einer Verzeichnisstruktur, die Sie an einer beliebigen Stelle in der Verzeichnisstruktur ablegen können, ohne die Symlinks zu unterbrechen.
Um Ihnen ein Beispiel zu geben, was ich meine, nehmen wir an, Sie arbeiten an einem Projekt und Sie haben eine ganze Verzeichnisstruktur dafür eingerichtet, wie folgt:
Angenommen, Sie möchten einen Symlink nach
widgets/
innen erstellenwizardry/
. Sie haben zwei Möglichkeiten:oder
Wenn Sie dann versuchen
/home/you/project
, sich an eine andere Stelle zu bewegen , wird ein mit dem ersten Formular erstellter Symlink aufgrund der Suche unterbrochen/home/you/project/widgets
. In der zweiten Form bleibt der Symlink funktionsfähig, da er../widgets
relativ zu dem Ort gesucht wird, an dem er sich befindet, unabhängig davon, wo sich dieser Ort in der Verzeichnisstruktur befindet.quelle