ln -s mit einem Pfad relativ zu pwd

Ich versuche, eine Reihe symbolischer Links zu erstellen, kann aber nicht herausfinden, warum dies funktioniert

ln -s /Users/niels/something/foo ~/bin/foo_link 

, während dies

cd /Users/niels/something ln -s foo ~/bin/foo_link 

nicht ist.

Ich glaube, es hat etwas mit der foo_link Verknüpfung mit foo in /Users/niels/bin anstelle von /Users/niels/something zu tun

Die Frage ist also, wie ich einen symbolischen Link erstelle, der auf einen absoluten Pfad verweist, ohne ihn tatsächlich einzugeben.

Als Referenz verwende ich Mac OS X 10.9 und Zsh .

Antwort

Der einfachste Weg, als absoluter Pfad auf das aktuelle Verzeichnis zu verlinken, ohne die gesamte Pfadzeichenfolge einzugeben, wäre

ln -s "$(pwd)/foo" ~/bin/foo_link 

Das target (erstes) Argument für das ln -s Der Befehl funktioniert relativ zum Speicherort des symbolischen Links, nicht zu Ihrem aktuellen Verzeichnis. Es ist hilfreich zu wissen, dass es sich im Wesentlichen um den Ersteller handelt ed symlink (das zweite Argument) enthält einfach den Text , den Sie für das erste Argument angegeben haben.

Wenn Sie also Folgendes tun:

cd some_directory ln -s foo foo_link 

und verschieben Sie diesen Link dann um

mv foo_link ../some_other_directory ls -l ../some_other_directory 

Sie werden sehen, dass foo_link versucht , auf foo in dem Verzeichnis zu verweisen, in dem es sich befindet. Dies funktioniert auch mit symbolischen Links, die auf relative Pfade verweisen. Wenn Sie Folgendes tun:

ln -s ../foo yet_another_link 

und dann yet_another_link in ein anderes Verzeichnis verschieben und prüfen, wohin es zeigt, Sie werden sehen, dass es immer auf ../foo zeigt. Dies ist das beabsichtigte Verhalten, da oft symbolische Links Teil einer Verzeichnisstruktur sein können, die sich in verschiedenen absoluten Pfaden befinden kann.

In Ihrem Fall gilt beim Erstellen des Links durch Eingabe von

ln -s foo ~/bin/foo_link 

foo_link nur a Link zu foo relativ zu seiner Position. Wenn Sie $(pwd) vor den Namen des Zielarguments setzen, werden einfach die aktuellen Arbeitsverzeichnisse hinzugefügt absoluter Pfad, sodass der Link mit einem absoluten Ziel erstellt wird.

Kommentare

  • " … hilft sich vorzustellen , dass der erstellte Symlink einfach Text enthält …. " Isn ' Ist das nicht die wörtliche Wahrheit?
  • Es ist. Vielleicht könnte ich vorstellen in " know " oder " verstehe ".
  • Vielleicht habe ich mich (wieder) verwirrt. Wenn Sie sagen, " Ziel " meinen Sie " source ". Das Argument source_file (first) gibt an, wo der Link verweist. Dies ist wörtlich, was Sie in den Befehl eingeben. Das Argument target_file (zweites) wird zum Namen des Links, es sei denn, Sie geben ein Verzeichnis ein. In diesem Fall entspricht der Linkname dem Basisnamen des source_file, aber im Verzeichnis target_file abgelegt.
  • Y̶o̶u̶ ' ' s einen Fehler in der ̶a̶n̶s̶w̶e̶r̶.̶ verrückt, wie es didn ' T verhaken ̶s̶o̶o̶n̶e̶r̶.̶ ̶F̶i̶x̶i̶n̶g̶.̶ Nein, war die Antwort richtig. In der Manpage ln ist target das erste Argument (wobei der Link auf verweist), während das zweite Argument wird einfach als link bezeichnet (source wird nicht erwähnt).
  • Unter Linux (gnu ln) wird das Manpage ruft das erste Argument target und das zweite link ( man7.org/ auf) linux / man-pages / man1 / ln.1.html ). In BSD (einschließlich OS X) heißt das erste source und das zweite target ( freebsd.org/cgi/man.cgi?ln ). Ziemlich verwirrend.

Antwort

Verwenden Sie die -r (--relative) funktioniert dies:

ln -sr foo ~/bin/foo_link 

Kommentare

  • Beachten Sie, dass -r ein GNUismus ist, dh kein POSIX, sodass ' im OP-Fall nicht als Standard-OS X ln basiert auf BSD.

Antwort

Um einige zu speichern Wenn Sie tippen, können Sie

ln -s "$PWD"/foo ~/bin/foo_link 

Kommentare

  • @Freddy, dies hängt von der Shell ab. In Fisch oder Zsh wäre es OK.In Bourne-ähnlichen Shells einschließlich Bash und mit dem Standardwert $ IFS wäre SPC zwar ein Problem, aber auch TAB, NL und alle Globbing-Zeichen (mindestens *, ? und [...]).
  • @St é phaneChazelas Ja, Sie ' ist richtig und die Frage ist mit bash gekennzeichnet, sodass ' im Allgemeinen a ist gute Idee, es zu zitieren. Mein schlechtes, ich hätte genauer sein sollen.

Antwort

Wie wäre es mit:

 $ cd /Users/niels/something $ ln -s ./foo ~/bin/foo_link 

Kommentare

  • Nein, ' macht den Trick nicht.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.