ln -s с дорогой относительно pwd

Я пытаюсь создать кучу символических ссылок, но я не могу понять, почему это работает

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

в то время как

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

не является.

Я считаю, что это связано с foo_link к foo in /Users/niels/bin вместо /Users/niels/something

Итак, вопрос в том, как создать символическую ссылку, указывающую на абсолютный путь, не набрав ее?

Для справки, я использую Mac OS X 10.9 и Zsh.

Самый простой способ привязки к текущему каталогу как абсолютного пути, без ввода всей строки пути, будет

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

Аргумент target (first) для команды ln -s работает относительно местоположения символической ссылки, а не вашего текущего каталога. Это помогает понять, что, по существу, созданная symlink (второй аргумент) просто содержит текст, который вы указываете для первого аргумента.

Поэтому, если вы выполните следующее:

 cd some_directory ln -s foo foo_link 

а затем переместите эту ссылку вокруг

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

вы увидите, что foo_link пытается указать на foo в каталоге, в котором он находится. Это также работает с символическими ссылками, указывающими на относительные пути. Если вы выполните следующее:

 ln -s ../foo yet_another_link 

а затем переместите yet_another_link в другой каталог и проверьте, на что он указывает, вы увидите, что он всегда указывает на ../foo . Это предполагаемое поведение, так как много раз символические ссылки могут быть частью структуры каталогов, которая может находиться в разных абсолютных путях.

В вашем случае, когда вы создаете ссылку, набрав

 ln -s foo ~/bin/foo_link 

foo_link просто содержит ссылку на foo относительно своего местоположения. Ввод $(pwd) перед именем целевого аргумента просто добавляет абсолютный путь текущего рабочего каталога, так что ссылка создается с абсолютной целью.

Использование флага -r ( --relative ) сделает эту работу:

 ln -sr foo ~/bin/foo_link 

Как насчет:

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