Мне нужна символическая ссылка, которая разрешается относительно каталога, в котором она находится. Какая команда используется для создания такой вещи?
Мне нужна символическая ссылка, которая разрешается относительно каталога, в котором она находится. Какая команда используется для создания такой вещи?
Ответы:
ln -s ../some/other/file linkname
Указанный вами путь сохраняется вместе с файлом. При доступе к файлу сохраненный путь ищется и раскрывается относительно файла. Он не знает, в каком каталоге вы были, когда создавали ссылку.
ln -s ../some/other/file /some/dir/linkname
ln -s ./file linkname
поскольку .
ссылается на текущий каталог.
ln -s somedir/original-dir link-name
не работает. Он создает каталог с именем link-name
, содержащим недопустимую ссылку. Команда, которая работает этоln -sr somedir/original-dir link-name
Недавние версии GNU coreutils 'ln (> = 8.16) поддерживают опцию --relative
(или -r
), которая означает, что вы можете вызывать ln -s
с 2 абсолютными или относительными (по отношению к вашему рабочему каталогу) путями, и она определит правильный относительный путь, который должен быть написано в символическую ссылку.
-r
опция полезна, когда вы выполняете кросс-компиляцию и вам нужны абсолютные пути на хосте сборки, но относительные пути на цели.
ln -r -s targetfile myalias
может помочь вам это исправить
Что вам нужно понять, так это то, что символическая ссылка больше похожа на текстовый файл, чем на запись каталога, которая содержит файл. Так что если вы
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
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