Вопрос или проблема
$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
ведет себя согласно определенным правилам, и понимание этих правил поможет избежать путаницы в будущем.