Мне нужна символическая ссылка, которая разрешается относительно каталога, в котором она находится. Какая команда используется для создания такой вещи?
5 ответов
- Перейдите в каталог, в котором вы хотите разместить ссылку
- Запустите команду
ln -s ../some/other/file linkname
Указанный вами путь сохраняется вместе с файлом. При доступе к файлу сохраненный путь ищется и раскрывается относительно файла. Он не знает, в каком каталоге вы были, когда создавали ссылку.
Последние версии GNU coreutils 'ln (> = 8.16) поддерживают --relative
(или -r
), что означает, что вы можете вызывать ln -s
с 2 абсолютными или относительными (по отношению к вашему рабочему каталогу) путями, и он определит правильный относительный путь, который должен быть записан в символическую ссылку.
Что вам нужно понять, так это то, что символическая ссылка больше похожа на текстовый файл, чем на запись каталога, которая содержит файл. Так что если вы
echo ../poo >/file/name
то это очень похоже на
ln -s ../poo /file/name
Системе все равно, существует ли /file/../poo
, это всего лишь фрагмент текста, который помещается в символическую ссылку. Когда что-то пытается открыть символическую ссылку, тогда система пытается разрешить это.
Если вы используете оболочку с дополнением имени файла, эта функция может сбить с толку, позволив вам завершить имя файла относительно вашего текущего рабочего каталога, даже если вы в конечном итоге используете его в качестве цели символической ссылки в совершенно другом каталоге.
Относительные ссылки были сложными для меня на OS X, то есть
~/Dropbox/git/dave-bot $ ln -s ../codyhess/bin ~/bin
~/Dropbox/git/dave-bot $ ln -s ../codyhess/bin/ ~/bin
оба не работали (что-то было создано, но это не каталог). Я создал нужную ссылку, используя абсолютные пути.
~/Dropbox/git/dave-bot $ ln -s ~/Dropbox/git/codyhess/bin/ ~/bin
Я просто хотел дополнительно объяснить, как создать символическую ссылку, используя относительные пути (с подробным примером).
Как упоминал Игнасио Васкес-Абрамс в комментариях, вы должны указать расположение файла / папки относительно того, где будет создана символическая ссылка, а не относительно вашего текущего каталога.
ПРИМЕР
Вы находитесь в /usr/share/nginx/html/_src/learn
Вы создадите coding
символической ссылки в /usr/share/nginx/html
Создать относительную символическую ссылку (теория):
sudo ln -s /path/to/source/file-or-folder/relative/from/symlink /path/to/symlink/relative/to/current/location
Создать фактическую относительную символическую ссылку:
sudo ln -s ./_src/learn/coding ../../coding
Больше информации (тот же пример)
current path: /usr/share/nginx/html/_src/learn
symlink(to be) relative to current path: ../../coding
symlink location (absolute): /usr/share/nginx/html/coding
folder/file relative to symlink location: ./_src/learn/coding
folder/file absolute path: /usr/share/nginx/html/_src/learn/coding