1

У меня есть 2 каталога (FOO, LALA). Я создаю символическую ссылку в одном из них, как это

ln -s /etc/apache2 FOO/apache2

После этого я хочу создать еще одну символическую ссылку, указывающую на тот же каталог, но не используя исходный каталог, а созданную символическую ссылку. Так что я стараюсь

ln -s FOO/apache2 LALA/apache2

Проблема в том, что вторая ссылка недействительна.

ls FOO/apache2

Выше работает и перечисляет файлы в /etc /apache2

ls LALA/apache2

Но это не так. Он просто перечисляет саму ссылку. Если я добавлю косую черту в конце каждого ls

ls FOO/apache2/

Работает так же.

ls LALA/apache2/

Я получаю ls: не могу получить доступ к LALA/apache2/: нет такого файла или каталога /


Если вместо

ln -s FOO/apache2 LALA/apache2

я делаю

cd LALA ; ln -s ../FOO/apache2 apache2

Тогда ссылка действительна

Есть идеи, какая разница?


Исходный вопрос отсюда https://stackoverflow.com/questions/10656666/use-a-symbolic-link-to-create-a-new-symbolic-link

1 ответ1

1

Разница в том, что относительные символические ссылки разрешаются во время доступа, а не во время создания.


В первом примере, если имя ссылки /somedir/LALA/apache2 и ее цель - FOO/apache2 , она будет преобразована в /somedir/LALA/FOO/apache2 при доступе к ней.

link name:                link target:    absolute target:
"/somedir/LALA/apache2" + "FOO/apache2" = "/somedir/LALA/FOO/apache2"

Во втором примере имя ссылки такое же - /somedir/LALA/apache2 - но ее цель, ../FOO/apache2 , теперь разрешается как:

link name:                link target:       absolute target:
"/somedir/LALA/apache2" + "../FOO/apache2" = "/somedir/LALA/../FOO/apache2"
                                           → "/somedir/FOO/apache2"

Это означает, что вы всегда должны давать " ../FOO/apache2 "в качестве цели для ln -s при создании второй ссылки, независимо от того, в каком каталоге вы сейчас находитесь.

Примечание. В последней версии coreutils команда ln имеет новую опцию -r/--relative , которая выполняет эту работу за вас. Например, ln -r -s FOO/apache2 LALA/apache2 будет работать правильно.

Для более старых версий вы можете взломать что-нибудь с помощью realpath --strip --relative-to ...
Я написал sym для собственного использования.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .