У меня есть следующая структура файла:
build/
client/
–> index.js
И когда я пытаюсь создать символическую ссылку с именем "client" внутри каталога сборки, которая ссылается на каталог клиента в cwd, примерно так
// Fails
$ pwd
/home/user/
$ ln -s client build/client
$ stat build/client/index.js
stat: build/client/index.js: stat: Too many levels of symbolic links
Я получаю сообщение об ошибке ELOOP, показанное выше. Когда я изменяю целевой путь на относительный путь, все хорошо:
// Works
$ pwd
/home/user/
$ ln -s ../client build/client
$ stat build/client/index.js
stat: <outputs file stats>
Это предполагаемое поведение, и, пожалуйста, объясните, почему ...
Ответы:
Для того, кто не работает, если мы посмотрим на
ls -l
результат, мы получим следующее:Теперь, чтобы понять, что здесь происходит. Давайте посмотрим на команду, которую вы вызвали:
Согласно Man Page, есть два возможных совпадения для этого формата
Он будет совпадать с первой формой (начиная с первой). Теперь «целевое имя» или,
client
в вашем случае, может быть (согласно полномуln
руководству) произвольной строкой. Им не нужно ничего решать прямо сейчас, но они могут разрешить что-то в будущем. То, что вы создаете с помощью своего вызова, является «висячей символической ссылкой», и система не удерживает вас от их создания.Теперь ваш второй вызов
ln -s ../client build/client
- это то, что называется «относительная символическая ссылка» (как вы отметили в своем посте). Существует второй тип, и это «абсолютная символическая ссылка», которая будет вызываться при выполненииln -s /home/user/client build/client
.Это не ошибка. Согласно инструкции в нем говорится:
Тем не менее, вы ДОЛЖНЫ использовать относительный или абсолютный путь к цели.
источник
Это действительно предполагаемое поведение. Со
ln(1)
страницы руководства :Что касается причины этого, представьте, что символическая ссылка вместо этого интерпретируется относительно ее источника, а не его назначения. При дальнейшем разрешении вам нужно будет знать, каким был ваш CWD, когда вы его создали, что бессмысленно, не говоря уже о невозможности.
Более того, таким образом вы получаете аккуратный и компактный метод для создания каркасной структуры каталогов, которую вы можете перетаскивать в любом месте дерева каталогов без разрыва символических ссылок.
Чтобы дать вам пример того, что я имею в виду, допустим, вы работаете над проектом и для него настроена целая структура каталогов, например:
Теперь предположим, что вы хотите создать символическую ссылку
widgets/
внутриwizardry/
. У вас есть два варианта:или
Если вы затем попытаетесь переместиться
/home/you/project
куда-нибудь еще, символическая ссылка, созданная с первой формой, прекратит работу, потому что ищет/home/you/project/widgets
. Вторая форма сохранит функциональность символической ссылки, потому что она ищет../widgets
относительно места, в котором она находится, независимо от того, где это место может быть в дереве каталогов.источник