ln -s avec un chemin relatif à pwd

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

  • " … aide à imaginer que le lien symbolique créé contient simplement du texte …. " Isn ' Est-ce la vérité littérale?
  • Cest vrai. Peut-être pourrais-je changer imagine en " know " ou " comprendre ".
  • Peut-être que je me suis (encore) confus. Il semble que là où vous dites " cible " vous voulez dire " source ". Largument source_file (premier) est lendroit où le lien pointe, ce qui correspond textuellement à ce que vous entrez dans la commande. Largument target_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 du source_file mais placé dans le répertoire target_file.
  • Y̶o̶u̶ ' ̶r̶e̶ ̶r̶i̶g̶h̶t̶̶̶̶̶ ̶̶̶ ̶ ̶th̶ere̶ ' š une erreur de Réponse. CRaZy COMMENT ÇA dIDN ' ṭ ̶s̶o̶o̶n̶e̶r̶.̶ ̶F̶i̶x̶i̶n̶g̶.̶ Laissez-vous emporter Non, la réponse était droit. Par la page de manuel 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é).
  • Sous linux (gnu ln), le La page de manuel appelle le premier argument target et le deuxième link ( man7.org/ linux / man-pages / man1 / ln.1.html ). Mais dans BSD (y compris OS X), le premier sappelle source et le second target ( freebsd.org/cgi/man.cgi?ln ). Plutôt déroutant.

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 standard ln 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.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *