ln -s mit einem Pfad relativ zu pwd

26

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 dieser

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

ist nicht.

Ich glaube, es hat etwas damit zu tun, mit foo_linkfoo in zu verlinken, /Users/niels/binanstatt/Users/niels/something

Die Frage ist also: Wie erstelle ich eine symbolische Verknüpfung, die auf einen absoluten Pfad verweist, ohne ihn tatsächlich einzugeben?

Als Referenz verwende ich Mac OS X 10.9 und Zsh.

Niels B.
quelle

Antworten:

33

Die einfachste Möglichkeit, eine Verknüpfung zum aktuellen Verzeichnis als absoluten Pfad herzustellen, ohne die gesamte Pfadzeichenfolge eingeben zu müssen, wäre

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

Das target(erste) Argument für den ln -sBefehl bezieht sich auf die Position des symbolischen Links und nicht auf Ihr aktuelles Verzeichnis. Es ist hilfreich zu wissen, dass der erstellte Symlink (das zweite Argument) einfach den Text enthält, den Sie für das erste Argument angegeben haben.

Wenn Sie also Folgendes tun:

cd some_directory
ln -s foo foo_link

und dann diesen Link bewegen

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

Sie werden sehen, dass foo_link versucht wird, fooauf das 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

Wechseln Sie dann yet_another_linkin ein anderes Verzeichnis, und überprüfen Sie, wo es hinweist. Sie werden feststellen, dass es immer auf verweist ../foo. Dies ist das beabsichtigte Verhalten, da symbolische Verknüpfungen oft Teil einer Verzeichnisstruktur sein können, die sich in verschiedenen absoluten Pfaden befinden kann.

In Ihrem Fall, wenn Sie den Link durch Eingabe erstellen

ln -s foo ~/bin/foo_link

foo_linkenthält nur einen Link zu foo, relativ zu seiner Position. Wenn Sie $(pwd)den Namen des Zielarguments voranstellen, wird lediglich der absolute Pfad des aktuellen Arbeitsverzeichnisses hinzugefügt, sodass die Verknüpfung mit einem absoluten Ziel erstellt wird.

Achilleas
quelle
"... hilft, sich vorzustellen, dass der erstellte Symlink einfach Text enthält ..." Ist das nicht die wörtliche Wahrheit?
Wildcard
1
Es ist. Vielleicht könnte ich mir vorstellen, zu "wissen" oder "verstehen".
Achilleas
Vielleicht habe ich mich (wieder) verwirrt. Es scheint, als ob Sie dort "Ziel" sagen, wo Sie "Quelle" meinen. Das source_file(erste) Argument ist die Stelle, an der der Link verweist. Das target_file(zweite) Argument wird zum Namen des Links, es sei denn, Sie geben ein Verzeichnis ein. In diesem Fall ist der Linkname derselbe wie der Basisname des, der sich source_filejedoch im Verzeichnis befindet target_file.
Charlie Gorichanaz
Sie haben Recht, ̶ wurde leider einen Fehler in der ̶a̶n̶s̶w̶e̶r̶.̶ verrückt , wie es Artikel nicht verhaken ̶s̶o̶o̶n̶e̶r̶.̶ ̶F̶i̶x̶i̶n̶g̶.̶ Nein, war die Antwort richtig. Durch die ln-Manpage, targetist das erste Argument (wo die Anlenkpunkte auf ) , wohingegen das zweite Argument ist einfach als die link( sourcenicht erwähnt).
Achilleas
3
Unter Linux (gnu ln) ruft die Manpage das erste targetund das zweite Argument auf link( man7.org/linux/man-pages/man1/ln.1.html ). Aber in BSD (einschließlich OS X) heißt der erste sourceund der zweite target( freebsd.org/cgi/man.cgi?ln ). Ziemlich verwirrend.
Cristoper
5

Wenn Sie das -r( --relative) -Flag verwenden, funktioniert Folgendes:

ln -sr foo ~/bin/foo_link
Geremia
quelle
4
-rBeachten Sie, dass dies ein GNUism ist, dh kein POSIX, und daher im OP-Fall nicht funktioniert, da der Standard-OS-X- lnBefehl BSD-basiert ist.
Juli
2

Um etwas Tipparbeit zu sparen, können Sie dies tun

ln -s "$PWD"/foo ~/bin/foo_link
Kosinus
quelle
@Freddy, es kommt auf die Shell an. In Fisch oder Fisch wäre es in Ordnung. In Bourne artigen Schalen einschließlich bash und mit dem Standardwert von $ IFS, würde SPC in der Tat ein Problem sein, aber auch TAB, NL und alle Globbing Zeichen (zumindest *, ?und [...]).
Stéphane Chazelas
@ StéphaneChazelas Ja, Sie haben Recht und die Frage ist mit einem Tag versehen bash, daher ist es im Allgemeinen eine gute Idee, sie zu zitieren. Mein schlechtes, ich hätte genauer sein sollen.
Freddy
0

Wie wäre es mit:

 $ cd /Users/niels/something
 $ ln -s ./foo ~/bin/foo_link
ptierno
quelle
1
Nein, macht den Trick nicht.
Niels B.