19

Я пытаюсь лучше понять символические ссылки ... и мне не очень повезло. Это мой фактический вывод оболочки с измененным именем пользователя / хостом:

username@host:~$ mkdir actual
username@host:~$ mkdir proper
username@host:~$ touch actual/file-1.txt
username@host:~$ echo "file 1" > actual/file-1.txt
username@host:~$ touch actual/file-2.txt
username@host:~$ echo "file 2" > actual/file-2.txt
username@host:~$ ln -s actual/file-1.txt actual/file-2.txt proper
username@host:~$ # Now, try to use the files through their links
username@host:~$ cat proper/file-1.txt
cat: proper/file-1.txt: No such file or directory
username@host:~$ cat proper/file-2.txt
cat: proper/file-2.txt: No such file or directory
username@host:~$ # Check that actual files do in fact exist
username@host:~$ cat actual/file-1.txt
file 1
username@host:~$ cat actual/file-2.txt
file 2
username@host:~$ # Remove the links and go home :(
username@host:~$ rm proper/file-1.txt
username@host:~$ rm proper/file-2.txt

Я подумал, что символическая ссылка должна работать прозрачно, в том смысле, что вы можете работать с файлом, на который он указывает, как если бы вы обращались к файлу напрямую (за исключением, конечно, случая rm где, конечно, ссылка просто удалены).

4 ответа4

41

Симлинки, как правило, любят полные пути или относительно ссылки, в противном случае они часто могут искать file-1.txt локально (как ни странно).

Перейдите к proper и выполните ls -l и вы увидите, что символическая ссылка ищет actual/file-1.txt , когда он должен быть ../actual/file-1.txt .

Итак, у вас есть два варианта:

  1. Дайте полный путь

    ln -s ~/actual/file-1.txt ~/actual/file-2.txt ~/proper
    
  2. Перейдите к папке, в которой вы хотите разместить ссылку, и ссылку оттуда

    cd proper
    ln -s ../actual/file-1.txt ../actual/file-2.txt ./
    

Редактировать: подсказка для сохранения ввода.

Вы можете просто сделать ln -s ~/actual/file-{1,2}.txt ~/proper

Элементы в фигурных скобках подставляются и располагаются друг за другом, создавая команду

ln -s ~/actual/file-1.txt ~/actual/file-2.txt ~/proper

который связывает оба файла с целевым каталогом. Сохраняет некоторые основные тип ввода по мере продвижения в оболочке.

2

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

$ ln -s ~/actual/file1.txt ~/actual/file2.txt ~/ Proper /

$ cat Proper /file1.txt

файл 1

$

Ваш пример создает ссылки proper которые ищут подкаталог с именем actual в текущем каталоге, а не предполагаемый родительский элемент обоих.

1

Символические ссылки могут быть хитрыми.  По сути, символическая ссылка - это файл, который содержит имя файла / путь к другому файлу (и который помечен для специальной обработки).  Если путь в файле ссылок начинается с ' / ', то он рассматривается как абсолютный путь, и все довольно просто.  Если он не начинается с косой черты, он рассматривается как относительный путь - относительно каталога, в котором находится ссылка.  (Это верно независимо от того, содержит ли имя косые черты.)  Итак, вы создали proper/file–1.txt как ссылку на « actual/file–1.txt », и когда вы попытались получить к нему доступ, система попыталась получить доступ к proper/actual/file–1.txt .  Ты должен был сказать

ln –s  ../actual/file–1.txt  ../actual/file–2.txt  proper

Кстати, вам не нужны touch команды. echo "file 1" > actual/file–1.txt достаточно для создания actual/file–1.txt .

0

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

Используйте cd .. и ls -l несколько раз, чтобы увидеть, являются ли ваши родительские каталоги символическими ссылками.

Если вам нужно создать символическую ссылку, cd в исходный каталог Target и создайте там новые символические ссылки, чтобы относительные пути были точными.

Или, если выразиться иначе: относительный путь - от начала к цели. Если источник впоследствии является символической ссылкой, это нормально. Но вы можете столкнуться с проблемами при настройке нового источника link_name в каталоге, который сам каким-то образом является символической ссылкой.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .