Требует ли ln -s нахождения в определенном каталоге?

Требует ли ln -s нахождения в определенном каталоге?

Я хочу создать простую символическую ссылку на файл.

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

/path/to/link $ ln -s /path/to/file .

Но если я нахожусь в любом другом каталоге, каждый раз создается неработающая ссылка:

/any/other/path $ ln -s /path/to/file /path/to/link

Требуется ли ln -sвам находиться в определенном каталоге, или я что-то упускаю? Работает Ubuntu 10.04.

Обновлять:Извините за путаницу с тем, были ли пути относительными или абсолютными. Они были относительными, и, как некоторые упомянули в своих ответах, это было источником моей проблемы. Спасибо!

решение1

Если вы не находитесь в том же каталоге, что и целевой объект, вам необходимо убедиться, что вы используете абсолютный путь.

ln -s foo/bar baz/quux # fails

ln -s ~/foo/bar baz/quux # succeeds

решение2

Я склонен использовать

ln -s $(pwd)/local_file /path/to/link

когда мне нужно связать локальный файл.

решение3

Это всегда неинтуитивно для меня. Я привыкаю делать:

ln -s $(readlink -f /path/to/file) /path/to/link

что должно работать, но ценой этого является то, что ссылка на диске становится нерелевантной.

решение4

На самом деле, это не то, в каком каталоге вы находитесь, само по себе. Это то, какую символическую ссылку вы создаете: символические ссылки — это просто файлы, содержащие путь, указывающий на файл. Вы можете создавать символические ссылки, содержащие пути, начинающиеся с символа /, или символические ссылки, не начинающиеся с этого символа. Вы можете создавать символические ссылки, содержащие ..компоненты пути, и символические ссылки, которые их не содержат. Когда программы разрешают символические ссылки для поиска целевого файла, они интерпретируют путь как относительный к каталогу, содержащему символическую ссылку. Поэтому вам просто нужно убедиться, что символическая ссылка имеет нужный вам путь.

Вот один из способов, который похож на ответ Мэтью Флашена, но здесь делаетсяродственниксимволическая ссылка:

/tmp$ mkdir -p spam/eggs/ham
/tmp$ mkdir foo
/tmp$ python -c "import os, sys; print os.path.relpath(sys.argv[1], os.path.abspath(sys.argv[2])), sys.argv[2]" $(readlink -e foo) spam/eggs/ham  | xargs ln -s 
/tmp$ ls -l spam/eggs/ham/foo
lrwxrwxrwx 1 user user 12 2012-02-05 15:12 spam/eggs/ham/foo -> ../../../foo

Несомненно, это можно сделать и в чистой оболочке Bourne / bash, но это легко правильно написать (и прочитать) на Python.

Связанный контент