Jessaye 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
ne lest pas.
Je pense que cela a quelque chose à voir avec le lien foo_link
vers foo dans /Users/niels/bin
au lieu de /Users/niels/something
La question est donc: comment créer un lien symbolique qui pointe vers un chemin absolu, sans le saisir?
Pour référence, jutilise Mac OS X 10.9 et Zsh .
Réponse
Le moyen le plus simple de créer un lien vers le répertoire courant en tant que chemin absolu, sans saisir la chaîne de chemin entière serait
ln -s "$(pwd)/foo" ~/bin/foo_link
target
(premier) argument pour ln -s
La commande fonctionne par rapport à l’emplacement du lien symbolique, et non à votre répertoire actuel. Elle permet de savoir que, essentiellement, la commande creat Le lien symbolique ed (le deuxième argument) contient simplement le texte que vous fournissez pour le premier argument.
Par conséquent, si vous faites ce qui suit:
cd some_directory ln -s foo foo_link
puis déplacez ce lien
mv foo_link ../some_other_directory ls -l ../some_other_directory
vous verrez que foo_link
essaie de pointer vers foo
dans le répertoire dans lequel il réside. Cela fonctionne également avec des liens symboliques pointant vers des chemins relatifs. Si vous procédez comme suit:
ln -s ../foo yet_another_link
puis déplacez yet_another_link
vers un autre répertoire et vérifiez où il pointe, vous verrez quil pointe toujours vers ../foo
. Cest le comportement prévu, car souvent les liens symboliques peuvent faire partie dune structure de répertoires qui peut résider dans divers chemins absolus.
Dans votre cas, lorsque vous créez le lien en tapant
ln -s foo ~/bin/foo_link
foo_link
contient juste un lien vers foo
, par rapport à son emplacement. Mettre $(pwd)
devant le nom de largument cible « ajoute simplement le répertoire de travail actuel » s chemin absolu, afin que le lien soit créé avec une cible absolue.
Commentaires
Réponse
Utilisation de -r
(--relative
) fera ce travail:
ln -sr foo ~/bin/foo_link
Commentaires
- Attention,
-r
est un GNUisme, cest-à-dire non POSIX donc ne fonctionnera ' dans le cas OP que sous OS X standardln
est basée sur BSD.
Réponse
Pour en sauver en tapant, vous pouvez faire
ln -s "$PWD"/foo ~/bin/foo_link
Commentaires
- @Freddy, cela dépend du shell. Dans le poisson ou le zsh, ce serait OK.Dans les shells de type Bourne incluant bash et avec la valeur par défaut $ IFS, SPC serait en effet un problème, mais aussi TAB, NL et tous les caractères globbing (au moins
*
,?
et[...]
). - @St é phaneChazelas Oui, vous ' à droite et la question est balisée avec
bash
, donc ' est généralement un bonne idée de le citer. Mon mauvais, jaurais dû être plus précis.
Réponse
Que diriez-vous:
$ cd /Users/niels/something $ ln -s ./foo ~/bin/foo_link
Commentaires
- Non, ' ne fait pas laffaire.
source_file
(premier) est lendroit où le lien pointe, ce qui correspond textuellement à ce que vous entrez dans la commande. Largumenttarget_file
(second) devient le nom du lien sauf si ce que vous entrez est un répertoire, auquel cas le nom du lien est le même que le nom de base dusource_file
mais placé dans le répertoiretarget_file
.ln
,target
est le premier argument (où le lien pointe vers ) tandis que le deuxième argument est simplement appelélink
(source
nest pas mentionné).target
et le deuxièmelink
( man7.org/ linux / man-pages / man1 / ln.1.html ). Mais dans BSD (y compris OS X), le premier sappellesource
et le secondtarget
( freebsd.org/cgi/man.cgi?ln ). Plutôt déroutant.