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 Argumenttarget_file
(zweites) wird zum Namen des Links, es sei denn, Sie geben ein Verzeichnis ein. In diesem Fall entspricht der Linkname dem Basisnamen dessource_file
, aber im Verzeichnistarget_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
isttarget
das erste Argument (wobei der Link auf verweist), während das zweite Argument wird einfach alslink
bezeichnet (source
wird nicht erwähnt). - Unter Linux (gnu ln) wird das Manpage ruft das erste Argument
target
und das zweitelink
( man7.org/ auf) linux / man-pages / man1 / ln.1.html ). In BSD (einschließlich OS X) heißt das erstesource
und das zweitetarget
( 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 Xln
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.