ln -s создает симлинк в существующей папке вместо того, чтобы выдавать ошибку?

Вопрос или проблема

$mkdir lnTest1 lnTest2

$ln -s lnTest1 "lnTest2" В конце “lnTest2” НЕТ косой черты!!

$ls lnT* -Rl |sed "s'$USER''g"
lnTest1:
total 0

lnTest2:
total 0
lrwxrwxrwx 1   7 Jun 22 22:48 lnTest1 -> lnTest1

Когда последний аргумент для ln является директорией, ссылки создаются в этой директории. В man-странице сказано:

СИНТАКСИС

    ln [ОПЦИЯ]... ЦЕЛЬ... ДИРЕКТОРИЯ     (3-й вариант)

В 3-м и 4-м вариантах создаются ссылки на каждую ЦЕЛЬ в ДИРЕКТОРИИ.

Не имеет значения, создаете ли вы жесткую или символическую ссылку. cp и mv ведут себя аналогично.

В ln есть флаг -T или --no-target-directory, который предотвращает подобное поведение:

-T, –no-target-directory

обращаться к LINK_NAME как к обычному файлу всегда

ln -s --no-target-directory lnTest1 "lnTest2"

ln: не удалось создать символическую ссылку ‘lnTest2’: Файл существует

Ответ или решение

Команда ln -s используется для создания символических ссылок в Unix-подобных операционных системах. Ваша ситуация продемонстрировала поведение ln, которое может показаться неожиданным.

Когда вы выполняете команду:

ln -s lnTest1 "lnTest2"

и в конце параметра "lnTest2" отсутствует слэш, это поведение объясняется спецификацией команды ln. Суть в том, что если последний аргумент не оканчивается на слэш, ln рассматривает его как имя файла для ссылки, а не как директорию.

Согласно документации (man page), команда ln может работать в разных формах:

  • Если последний аргумент является директорией, ln создает символические ссылки (или жесткие ссылки) для всех указанных целевых файлов в этой директории.
  • Если последний аргумент не является директорией, и вы просто указываете имя файла, то ln создан ссылку по этому имени в текущем каталоге или в указанном вами.

В вашем случае:

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

Если бы вы хотели, чтобы команда действительно создала символическую ссылку в директории lnTest2, вам нужно было бы сделать это следующим образом:

ln -s lnTest1 "lnTest2/symlink_name"

где symlink_name — это имя, под которым вы хотите видеть ссылку в lnTest2.

В дополнение, существует флаг -T или --no-target-directory, который предотвращает поведение, упомянутое выше. Используя этот флаг, вы можете заставить ln рассматривать последний аргумент как обычный файл, а не как имя директории. Вот пример:

ln -s --no-target-directory lnTest1 "lnTest2"

При выполнении этой команды вы получите сообщение об ошибке, если файл lnTest2 уже существует, так как ln попытается создать символическую ссылку, но по сути он встретит существующий файл.

Таким образом, команда ln -s ведет себя согласно определенным правилам, и понимание этих правил поможет избежать путаницы в будущем.

Оцените материал
Добавить комментарий

Капча загружается...