Чому моє символічне посилання не працює?


24

Я намагаюся краще зрозуміти символічні посилання ... і не маю великої долі. Це мій фактичний вихід оболонки із зміненим ім'ям користувача / хостом:

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якщо, звичайно, посилання просто видаляється ).


Як форматується ваш диск? Яку файлову систему ви використовуєте? (FAT не підтримує символьні посилання, але якщо ви спробуєте зробити файлову систему FAT, це має призвести до помилки.)
Ніколь Гамільтон

@NicoleHamilton - Це ext4 (згідно df -T) - чи є для вас теж дивним вищезгаданий результат?
orokusaki

@orokusaki Не дивно. Дивіться мою відповідь нижче. Лише голова вгору, не потрібно чіпати файли, щоб котитися до них. Їм навіть не потрібно існувати. Просто, щоб заощадити набравши текст!
nerdwaller

Відповіді:


50

Символьні посилання, як правило, люблять повний шлях або відносно посилання, інакше їх часто можна шукати 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
Спасибі - я збирався витягнути волосся, перш ніж прочитати вашу відповідь.
orokusaki

1
Іноді це заплутано точно! Linux, як правило, дуже буквальний, тому, якщо ви скажете зробити щось - це буде. Будьте обережні з таким чином, що позначає папки, я перезаписав одну або дві раніше (Просто вкажіть ім'я без косої риски). Крім того, не rm -rf *папку, що перебуває у посиланнях, - ви можете стерти папку, на яку вона посилається. Просто зробіть rm symlinkname. Лише кілька речей, у яких я помилився: D
nerdwaller

3

Проблема полягає у використанні відносних шляхів. Якщо ви вказали створення свого посилання за допомогою повного явного шляху, воно працює.

$ ln -s ~ / фактичний / file1.txt ~ / фактичний / файл2.txt ~ / належний /

$ cat власне / file1.txt

файл 1

$

Ваш приклад створює посилання, properякі шукають підкаталог з іменем "фактичний" у поточному каталозі, а не призначений батько обох.


1

Символічні посилання можуть бути складними. По суті, символічне посилання - це файл, який містить ім'я / назву шляху для іншого файлу (і він позначений для спеціальної обробки). Якщо ім'я шляху у файлі посилання починається з ' /', то воно трактується як абсолютна назва шляху, і все є досить зрозумілим. Якщо він не починається з косою косою рисою, він розглядається як відносне ім'я шляху - відносно каталогу, де знаходиться посилання. (Це вірно, чи містить ім'я косої риси чи ні). Отже, ви створили proper/file–1.txtпосилання на " actual/file–1.txt", і коли ви намагалися отримати доступ до нього, система намагалася отримати доступ proper/actual/file–1.txt. Ви повинні були сказати

ln s  ../actual/file1.txt  ../actual/file2.txt  proper

До речі, вам не потрібні були touchкоманди.  echo "file 1" > actual/file–1.txtє достатнім для створення actual/file–1.txt.


0

Пов’язане питання, і воно може бути очевидним для багатьох, але натрапило на кілька хвилин: якщо ви створюєте симпосилання в каталозі, який сам по собі пов'язаний, або є символьне посилання в межах поточного робочого каталогу, ви можете натрапити на проблеми із символьними посиланнями, які не працюють.

Використовуйте cd ..та ls -lнеодноразово, щоб побачити, чи самі батьківські каталоги пов'язані між собою.

Якщо вам потрібно створити символьне посилання cdдо оригінального каталогу Target і створити там нові посилання, тож відносні шляхи є точними.

Або кажучи іншим способом: відносний шлях - від Походження до Цілі. Якщо згодом Походження позначається символом, це нормально. Але ви можете зіткнутися з проблемами налаштування нового Origin link_name всередині каталогу, який сам якось пов'язаний.


1
Замість " cd ..і ls -lповторно" ви можете використовувати namei -mox $PWD. Іншим корисним способом з'ясувати, чи є посилання на шляху, є використання pwd -P, яке дає вам шлях до поточного каталогу, який не містить жодних символьних посилань (тому, якщо pwdі pwd -Pдають різний вихід, ви знаєте, що десь на шляху є символьне посилання ).
Ansa211

0

При спробі створити посилання на файл, який не існує (або ви неправильно вказали шлях), ln -s не видає помилки. Він створює посилання, але коли ви намагаєтеся "cat" на цьому посиланні, він каже, що файл не знайдено. Навіть коли ви можете бачити це за допомогою ls. У таких випадках завжди двічі перевіряйте шлях до файлу.

ubuntu@ip-172-31-80-155:~/lab5$ ln -s etc/ufw/ufw.conf link1
ubuntu@ip-172-31-80-155:~/lab5$ ls -al
total 5360
drwxrwxr-x 2 ubuntu ubuntu    4096 Mar  9 18:56 .
drwxr-xr-x 7 ubuntu ubuntu    4096 Mar  9 18:42 ..
-rwxr--r-- 1 ubuntu ubuntu 5478400 Mar  9 18:32 backup.tar
lrwxrwxrwx 1 ubuntu ubuntu      16 Mar  9 18:56 link1 -> etc/ufw/ufw.conf
ubuntu@ip-172-31-80-155:~/lab5$ cat link1
cat: link1: No such file or directory

Тому що файл etc / ufw / ufw.conf не існує. Правильний шлях - /etc/ufw/ufw.conf

ubuntu@ip-172-31-80-155:~/lab5$ ln -s /etc/ufw/ufw.conf link2
ubuntu@ip-172-31-80-155:~/lab5$ ls -l
total 5352
-rwxr--r-- 1 ubuntu ubuntu 5478400 Mar  9 18:32 backup.tar
lrwxrwxrwx 1 ubuntu ubuntu      16 Mar  9 18:56 link1 -> etc/ufw/ufw.conf
lrwxrwxrwx 1 ubuntu ubuntu      17 Mar  9 19:00 link2 -> /etc/ufw/ufw.conf
ubuntu@ip-172-31-80-155:~/lab5$ cat link2
# /etc/ufw/ufw.conf
#

# Set to yes to start on boot. If setting this remotely, be sure to add a rule
# to allow your remote connection before starting ufw. Eg: 'ufw allow 22/tcp'
ENABLED=no

# Please use the 'ufw' command to set the loglevel. Eg: 'ufw logging medium'.
# See 'man ufw' for details.
LOGLEVEL=low

Вже є краща відповідь, і перша частина, що ln -s"іноді" не перевіряє наявність цілі, просто неправильно.
RalfFriedl
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.