ln -s avec un chemin par rapport à pwd

26

J'essaie de créer un tas de liens symboliques, mais je ne peux pas comprendre pourquoi cela fonctionne

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

alors que ce

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

n'est pas.

Je crois que cela a quelque chose à voir avec un foo_linklien vers foo au /Users/niels/binlieu de/Users/niels/something

La question est donc de savoir comment créer un lien symbolique qui pointe vers un chemin absolu, sans vraiment le taper?

Pour référence, j'utilise Mac OS X 10.9 et Zsh.

Niels B.
la source

Réponses:

33

Le moyen le plus simple de créer un lien vers le répertoire en cours en tant que chemin absolu, sans taper la chaîne de chemin entière, serait

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

Le target(premier) argument de la ln -scommande fonctionne par rapport à l'emplacement du lien symbolique, et non à votre répertoire actuel. Il est utile de savoir que, essentiellement, le lien symbolique créé (le deuxième argument) contient simplement le texte que vous fournissez pour le premier argument.

Par conséquent, si vous procédez comme suit:

cd some_directory
ln -s foo foo_link

puis déplacer ce lien

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

vous verrez que foo_link tente de pointer vers foole répertoire dans lequel il réside. Cela fonctionne également avec les liens symboliques pointant vers des chemins relatifs. Si vous procédez comme suit:

ln -s ../foo yet_another_link

puis déplacez-vous yet_another_linkvers un autre répertoire et vérifiez où il pointe, vous verrez qu'il pointe toujours vers ../foo. Il s'agit du comportement souhaité, car de nombreux liens symboliques peuvent faire partie d'une structure de répertoires pouvant résider dans différents chemins absolus.

Dans votre cas, lorsque vous créez le lien en tapant

ln -s foo ~/bin/foo_link

foo_linkdétient juste un lien vers foo, par rapport à son emplacement. Le fait de placer $(pwd)devant le nom de l'argument cible ajoute simplement le chemin absolu du répertoire de travail actuel, de sorte que le lien est créé avec une cible absolue.

Achilleas
la source
"... aide à imaginer que le lien symbolique créé contient simplement du texte ...." N'est-ce pas la vérité littérale?
Wildcard
1
C'est. Je pourrais peut-être changer d' imaginer «savoir» ou «comprendre».
Achilleas
Peut-être que je me suis confondu (encore). Il semble que lorsque vous dites «cible», vous voulez dire «source». Le source_file(premier) argument est l'endroit où le lien pointe, ce qui correspond à ce que vous entrez dans la commande. Le target_file(deuxième) argument devient le nom du lien, sauf si vous entrez un répertoire, auquel cas le nom du lien est le même que le nom de base du source_filemais placé dans le répertoire target_file.
Charlie Gorichanaz
Vous avez raison, ̶ Theres une erreur de Réponse. CRaZy COMMENT ÇA didnt ̶s̶o̶o̶n̶e̶r̶.̶ ̶F̶i̶x̶i̶n̶g̶.̶ Laissez - vous emporter Non, la réponse était juste. Par la lnpage de manuel, targetest le premier argument (où les points de liaison à ) alors que est simplement appelé le second argument link( sourcenon mentionné).
Achilleas
3
Sous linux (gnu ln), la page de manuel appelle le premier argument targetet le second link( man7.org/linux/man-pages/man1/ln.1.html ). Mais dans BSD (y compris OS X), le premier est appelé sourceet le second target( freebsd.org/cgi/man.cgi?ln ). Assez déroutant.
cristoper
5

L'utilisation du drapeau -r( --relative) rendra ce travail:

ln -sr foo ~/bin/foo_link
Geremia
la source
4
Attention c'est -run GNUisme, c'est-à-dire non POSIX donc ne fonctionnera pas dans le cas OP car la lncommande OS X standard est basée sur BSD.
jlliagre
2

Pour économiser de la frappe, vous pouvez faire

ln -s "$PWD"/foo ~/bin/foo_link
cosinus
la source
@Freddy, cela dépend du shell. En poisson ou en zsh, ce serait OK. Dans les shells de type Bourne incluant bash et avec la valeur par défaut de $ IFS, SPC serait en effet un problème, mais aussi TAB, NL et tous les caractères globbing (au moins *, ?et [...]).
Stéphane Chazelas
@ StéphaneChazelas Oui, vous avez raison et la question est taguée bash, c'est donc généralement une bonne idée de la citer. Mon mauvais, j'aurais dû être plus précis.
Freddy
0

Que diriez-vous:

 $ cd /Users/niels/something
 $ ln -s ./foo ~/bin/foo_link
ptierno
la source
1
Non, ne fait pas l'affaire.
Niels B.