LINUX.ORG.RU
ФорумTalks

Симлинки странные

 


0

1
$ mkdir testdir
$ ln -s testdir link1
$ ln -s testdir/ link2
$ ls -l
total 0
lrwxrwxrwx. 1 user group 7 Jul  4 04:52 link1 -> testdir
lrwxrwxrwx. 1 user group 8 Jul  4 04:52 link2 -> testdir/
drwxrwxr-x. 2 user group 6 Jul  4 04:52 testdir
$ readlink link1
testdir
$ readlink link2
testdir/

Если кто не понял, симлинки различаются наличием слеша в конце. А теперь вопрос, есть ли какая-то детектируемая разница между этими вариантами?

// спрятал бороду под одеяло.

★★★★★

Конечно есть - размер первого симлинка 7 байт, второго - 8.
А так - все 9: ln -s ./testdir link3

bigbit ★★★★★
()

Горшочек, не вари. Что ни день, так тред бессмысленный вчерашнего.

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

Это понятно, но я почему-то был уверен, что какая-то нормализация пути изначально производится, какой смысл в хранении этих ././././xxx////.///././, а потом ещё разматывать это всё при каждой операции.

Legioner ★★★★★
() автор топика
Последнее исправление: Legioner (всего исправлений: 4)

Вообще со Slash’ом на конце есть самые разные MindFuck’и у самых разных консольных команд.

Наверное лучше всего не использовать его.

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

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

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

А почему-бы емаксу не хранить текст внутри текстовых файлов, а не в симлинках? Это какой-то странный юз-кейс.

Legioner ★★★★★
() автор топика

Есть. Если ты удалишь testdir и заменишь его на файл, то по первой симлинке всё ещё можно будет пройти (например, сделать cat link1), а по второй - уже нет.

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

какой смысл в хранении этих ././././xxx////.///././, а потом ещё разматывать это всё при каждой операции.

Такой линк останется валидным, когда дерево куда-то скопируют.

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

а потом ещё разматывать это всё при каждой операции

dentry-кеш помогает не разматывать слишком часто.

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

Если его на этапе создания размотать в xxx, он тоже останется валидным.

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

Например, чтобы не хранить лишний инод.

А какой смысл нормализовать путь при создании - непонятно.

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

Я уже написал - какой. Нормализовать при доступе к файлу всё равно придётся. И разумней это сделать один раз при создании симлинка, чем делать это каждый раз при доступе к файлу.

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

Что такое здесь нормализация, ведомо лишь тебе, потому ни ты, ни кто-то другой этот термин не определили. Если под нормализацией ты имеешь в виду резолвинг в абсолют (что можно заподозрить по

Нормализовать при доступе к файлу всё равно придётся.

), то нет, нельзя. Тебе уже написали, что нет, симлинки должны оставаться валидными при перемещении. Нельзя заранее зарезолвить ../../a/b.

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

Ну нет. Путь парсить каждый раз придется всё равно и более менее пофиг убрали там лишние слеши или нет.

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

Нормализация это удаление избыточной информации. Резолвинг в абсолют тут не при чём. В ../../a/b избыточной информации нет. А в ../////../././././././././/a////././././././b есть.

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

и как часто ты видел симлинки с килобайтами лишних слешей и точек?

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

Ну и «нормализуй» как все, при создании, методом неделанья вот этой надуманной дичи.

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

я почему-то был уверен, что какая-то нормализация пути изначально производится, какой смысл в хранении этих ././././xxx////.///././, а потом ещё разматывать это всё при каждой операции.

Смысл в том, что результат нормализации может измениться.

hummer
()
Ответ на: комментарий от Legioner

Не может.

Сам подумай, .. - это родительский каталог. Если я переместил текущую директорию в другое место, то и родительский каталог стал другим, то есть результат нормализации .. изменился.

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

Я не предлагаю убирать ... Я предлагаю убирать ////.//////.////.////-подобный мусор. Который ни при каких условиях не меняет значения симлинка.

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

В общем случае неизвестна семантика той строки, которая записана в симлинке. Например, это может быть симлинк на NTFS, где используются другие символы в качестве разделителя в пути, а драйвер файловой системы предоставляет свою реализацию follow_link, которая про это знает. Симлинка может быть создана одной ОС, а прочитана - другой.

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

Ровно наоборот.

«Преждевременная оптимизация — корень всех зол.» - Дональд Кнут, статья «Structured Programming with go to Statements» в сборнике «Computing Surveys» (Vol. 6, № 4, декабрь 1974)

Ты хочешь на каждое создание симлинка что-то там «нормализовать»/оптимизировать, что бестолку сожрет время, т.к. примерно все делают нормальные симлинки, которые не надо «нормализовать». Соответственно на этапе открытия выигрыша не будет никакого.

sergej ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.