LINUX.ORG.RU

Ошибка с символической ссылкой

 


0

1

Задание: cоздать символическую ссылку для файла sewaddle4 с именем lab0/charmander4/machampsewaddle

Использую команду: ln -s sewaddle4 charmander4/machampsewaddle

Ссылка создаётся, но файл пустой, а при любой команде которая трогает эту ссылку, выдаёт ошибку что такой файл или директория отсутствует, подскажите что я делаю не так.

Значит он отсутствует.

Да, создаю его гораздо раньше в скрипте командой:

Значит не там где надо создаёшь. Ссылка, которую ты создаёшь, указывает на файл в той же директории что и ссылка, на всякий случай, а у тебя он в какой?

firkax ★★★★★
()
Ответ на: комментарий от anonymous

Нет, наоборот лучше так не делать, если только речь не о ссылке на какой-нить /bin/grep или другой глобально-системный файл из несистемного места. А вот освоить правильную обработку относительных не помешает.

firkax ★★★★★
()
Ответ на: комментарий от acrighthere

Тогда надо правильно указать путь в ссылке. Путь в ссылке начинается от директории в которой она расположена, тебе надо сначала выйти наверх (../).

Для команды ln первый аргумент - просто текстовая строка, она её записывает в ссылку как есть. В качестве пути эта строка разбирается только когда ты эту ссылку пытаешься потом открыть.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от alx777

Нет, надо просто научиться относительные пути понимать. А -r это спрятать своё непонимание подальше чтоб оно создало неожиданные проблемы уже в другом месте, возможно более критичном.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 2)
Ответ на: комментарий от firkax

То есть вместо

ln -sr sewaddle4 charmander4/machampsewaddle

юзать

ln -s ../sewaddle4 charmander4/machampsewaddle

?

Ну не знаю, на мой взгляд второй вариант смотрится довольно странно …

А -r это спрятать своё непонимание подальше чтоб оно создало неожиданные проблемы уже в другом месте, возможно более критичном.

А можно пример такой проблемы ?

alx777 ★★
()
Ответ на: комментарий от alx777

Вот надо как раз сделать так, чтоб второй вариант стал тебе интуитивно понятен, тогда в будущем проблем с симлинками больше не будет.

А можно пример такой проблемы ?

Ввод магических команд вместо понимания ситуации - это всегда какие-то проблемы в итоге.

ln -s ../sewaddle4 charmander4/machampsewaddle

Вот смотри, charmander4/machampsewaddle будет симлинком на ../sewaddle4, и оно расположено в директории charmander4. То есть вот мы находимся в charmander4, делаем следующий шаг - открываем machampsewaddle, а там указание - иди в ../sewaddle4. В соответствии с ним мы сначала переходим в .. а потом в sewaddle4. Итого путь charmander4/../sewaddle4.

Если же ты введёшь такое

ln -s sewaddle4 charmander4/machampsewaddle

То, когда система доходит до разбора содержимого линка machampsewaddle -> sewaddle4, откуда она узнает, что ты имел ввиду другую директорию? В симлинке записано ровно то, что ты заказал, про директорию ни слова.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от firkax

Когда необходим относительный путь к файлу, например внутри каталога, то этот путь и надо указывать. Название каталога может смениться, а ссылка сохранится. А вот когда вот так вот ../каталог, то гарантий меньше.

dmitry237 ★★★★
()
Ответ на: комментарий от dmitry237

Гарантий меньше, но это всё равно самый надёжный способ из существующих. Абсолютные ссылки в home всё равно намного хуже, они ломаются от любого переименования/перемещения.

firkax ★★★★★
()
Ответ на: комментарий от firkax

Вот надо как раз сделать так, чтоб второй вариант стал тебе интуитивно понятен, тогда в будущем проблем с симлинками больше не будет.

У меня никогда не было и нет проблем с симлинками, я понимаю как работают оба варианта, но первый лично мне удобнее

А можно пример такой проблемы ?

Ввод магических команд вместо понимания ситуации - это всегда какие-то проблемы в итоге.

Понятно

Вот смотри, charmander4/machampsewaddle будет симлинком на ../sewaddle4, и оно расположено в директории charmander4. То есть вот мы находимся в charmander4, делаем следующий шаг - открываем machampsewaddle, а там указание - иди в ../sewaddle4. В соответствии с ним мы сначала переходим в .. а потом в sewaddle4. Итого путь charmander4/../sewaddle4.

Relative symlink он на то и relative что любого из участников можно взять за точку отсчета

Долгое время Солнце вращалось вокруг Земли, теперь Земля вокруг Солнца, и обе модели пригодны для практического использования

Мне проще сказать

«возьми файл sewaddle4 в текущем каталоге и создай на него симлинк с именем machampsewaddle в каталоге charmander4»

чем

«перейди в charmander4 и уже там создай симлинк с именем machampsewaddle на эээээ… кстати куда ? sewaddle4 ? Нет, он же будет на уровень выше. ../sewaddle4 ! Profit !»

То, когда система доходит до разбора содержимого линка machampsewaddle -> sewaddle4, откуда она узнает, что ты имел ввиду другую директорию? В симлинке записано ровно то, что ты заказал, про директорию ни слова.

Я как-то обратил внимание, что оказывается команда ls запущенная без параметров, выводит список файлов в текущей директории. Почему бы и ln не использовать текущую директорию по умолчанию ?

alx777 ★★
()
Ответ на: комментарий от alx777

Relative symlink он на то и relative что любого из участников можно взять за точку отсчета

я понимаю как работают оба варианта,

Видимо таки не понимаешь. У симлинка только один участник - это сам файл симлинка. Его содержимое - просто текстовая строка (иногда в них вообще произвольные данные хранят вместо путей). Интерпретация этой строки в качестве пути происходит только когда ты симлинк пытается открыть.

возьми файл sewaddle4 в текущем каталоге и создай на него симлинк с именем machampsewaddle в каталоге charmander4

Но симлинк всё равно будет создан не на этот файл, а на путь ../sewaddle4 (который сейчас указывает на этот файл, а потом может и на другой стать) - этот ключ просто добавляет юзерспейсную предобработку.

Почему бы и ln не использовать текущую директорию по умолчанию ?

Она и использует. Но у ln путь-аргумент только один - второй. Первый - это просто текстовая строка, она никак не парсится заранее и не интерпретируется. Парсит её уже ядро когда-то потом.

firkax ★★★★★
()
Ответ на: комментарий от firkax

У симлинка только один участник - это сам файл симлинка. Его содержимое - просто текстовая строка (иногда в них вообще произвольные данные хранят вместо путей). Интерпретация этой строки в качестве пути происходит только когда ты симлинк пытается открыть.

Рад, что ты обладаешь такими глубокими познаниями по этой теме

Не знаю, для каких целей и как используешь симлинки ты, мне они нужны для создания ссылок на заведомо существующие файлы и каталоги

Моей точкой отсчета является именно TARGET а не какой-то там LINK_NAME, поэтому лично мне удобнее использовать ln -sr вне зависимости от того в каком виде и где на самом деле хранится симлинк

Главное чтобы после

❯ ln -sr sewaddle4 charmander4/machampsewaddle

каталог выглядел вот так и стрелка не подсвечивалась красным

❯ exa -T
.
├── charmander4
│  └── machampsewaddle -> ../sewaddle4
└── sewaddle4

(который сейчас указывает на этот файл, а потом может и на другой стать)

Надеюсь, в твоей системе подобное происходит по твоему указанию а не случайным образом

этот ключ просто добавляет юзерспейсную предобработку.

И, судя по тому, что он существует, не только я признаю его полезным

alx777 ★★
()
Ответ на: комментарий от alx777

А если ты потом переместишь симлинк в другую директорию командой mv - он испортится. Или даже не сам симлинк, а кого-то по пути к нему. В случае «пишу ключ -r и оно как-то само работает» ты можешь даже не понять что случилось, а если б ты этот симлинк прописывал вручную - всё стало бы очевидно.

firkax ★★★★★
()
Ответ на: комментарий от firkax

он испортится

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

machampsewaddle -> ../sewaddle4

Ну так нафига такая нотация ../file, когда специально для этого предусмотрели ключ -r?

ln --help | grep '\-r'
  -r, --relative              with -s, create links relative to link location
dmitry237 ★★★★
()
Ответ на: комментарий от firkax

А если ты потом переместишь симлинк в другую директорию командой mv - он испортится. Или даже не сам симлинк, а кого-то по пути к нему.

По-моему, это и так понятно, что если ты видишь относительный симлинк «—❯❯❯ До Урюпинска 10км —❯❯❯» и тебе захотелось его куда-то перенести, то придется это делать вместе с Урюпинском и всем что между ними находится, либо создать новый относительный симлинк в желаемом месте

Или сделать абсолютно переносимый симлинк «Координаты Урюпинска XX°XX′ с. ш. YY°YY′ в. д.»

alx777 ★★
()