Почему & ldquo; ln & rdquo; команде нужен абсолютный путь?

Я сделал символическую ссылку, используя команду ln -s source target.

В первой попытке я использовал относительный путь, и в итоге я получил broken symbolic link...

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

5
задан 11 January 2018 в 18:25

8 ответов

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

zanna@toaster:~/playground$ mkdir linkyland anotherplace
zanna@toaster:~/playground$ cd linkyland
zanna@toaster:~/playground/linkyland$ ln -s sauce target
zanna@toaster:~/playground/linkyland$ file *
target: broken symbolic link to sauce

ln не волнует, существует ли исходный файл (поэтому, если вы делаете опечатку на пути, он не будет жаловаться) , Давайте создадим файл, к которому хотим привязать, и посмотрим, поможет ли это:

zanna@toaster:~/playground/linkyland$ > sauce
zanna@toaster:~/playground/linkyland$ file target
target: symbolic link to sauce

Теперь ссылка работает. Мы можем использовать только basename (последний элемент пути), потому что sauce находится в том же каталоге, что и target, поэтому target может хранить путь sauce, и этого достаточно, чтобы найти sauce когда нам это нужно.

zanna@toaster:~/playground/linkyland$ cd ../anotherplace
zanna@toaster:~/playground/anotherplace$ ln -s sauce target
zanna@toaster:~/playground/anotherplace$ file target
target: broken symbolic link to sauce

Эта символическая ссылка не работает, потому что здесь нет sauce. Путь sauce недостаточно информации. (С этого момента я удалил часть user@host моего приглашения для упрощения чтения, но я показываю часть, которая указывает текущий рабочий каталог, так как это показывает, как работают команды.). Мы можем исправить это, используя абсолютный путь для создания символической ссылки:

~/playground/anotherplace$ rm target
~/playground/anotherplace$ ls -s /home/zanna/playground/linkyland/sauce target
~/playground/anotherplace$ file target
target: symbolic link to /home/zanna/playground/linkyland/sauce

Однако мы могли бы также исправить это, сделав правильный относительный путь:

~/playground/anotherplace$ rm target 
~/playground/anotherplace$ ln -s ../linkyland/sauce target
~/playground/anotherplace$ file target
target: symbolic link to ../linkyland/sauce

Таким образом, идея о том, что нам нужны абсолютные пути ... просто неправильно. Нам нужен правильный путь, абсолютный или относительный.

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

~/playground/anotherplace$ cd ../linkyland
~/playground/linkyland$ ln -s /home/zanna/playground/linkyland/sauce target2
~/playground/linkyland$ cd ..
~/playground$ mv linkyland elsewhere
~/playground$ file elsewhere/target*
elsewhere/target: symbolic link to sauce
elsewhere/target2: broken symbolic link to /home/zanna/playground/linkyland/sauce

Поэтому часто предпочтительнее использовать относительные пути , Однако, если местоположение исходного файла вряд ли изменится, но расположение символьной ссылки correct может измениться, было бы предпочтительным использовать абсолютный путь:

~/playground$ cd anotherplace 
~/playground/anotherplace$ ln -s ../elsewhere/sauce target-rel
~/playground/anotherplace$ ln -s /home/zanna/playground/elsewhere/sauce target-abs
~/playground/anotherplace$ cd ..
~/playground$ mv anotherplace ..
~/playground$ cd ..
~$ file anotherplace/*
anotherplace/target-abs: symbolic link to /home/zanna/playground/elsewhere/sauce
anotherplace/target-rel: broken symbolic link to ../elsewhere/sauce
5
ответ дан 22 May 2018 в 15:38

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

zanna@toaster:~/playground$ mkdir linkyland anotherplace zanna@toaster:~/playground$ cd linkyland zanna@toaster:~/playground/linkyland$ ln -s sauce target zanna@toaster:~/playground/linkyland$ file * target: broken symbolic link to sauce

ln не волнует, существует ли исходный файл (поэтому, если вы делаете опечатку на пути, он не будет жаловаться) , Давайте создадим файл, к которому хотим привязать, и посмотрим, поможет ли это:

zanna@toaster:~/playground/linkyland$ > sauce zanna@toaster:~/playground/linkyland$ file target target: symbolic link to sauce

Теперь ссылка работает. Мы можем использовать только basename (последний элемент пути), потому что sauce находится в том же каталоге, что и target, поэтому target может хранить путь sauce, и этого достаточно, чтобы найти sauce когда нам это нужно.

zanna@toaster:~/playground/linkyland$ cd ../anotherplace zanna@toaster:~/playground/anotherplace$ ln -s sauce target zanna@toaster:~/playground/anotherplace$ file target target: broken symbolic link to sauce

Эта символическая ссылка не работает, потому что здесь нет sauce. Путь sauce недостаточно информации. (С этого момента я удалил часть user@host моего приглашения для упрощения чтения, но я показываю часть, которая указывает текущий рабочий каталог, так как это показывает, как работают команды.). Мы можем исправить это, используя абсолютный путь для создания символической ссылки:

~/playground/anotherplace$ rm target ~/playground/anotherplace$ ls -s /home/zanna/playground/linkyland/sauce target ~/playground/anotherplace$ file target target: symbolic link to /home/zanna/playground/linkyland/sauce

Однако мы могли бы также исправить это, сделав правильный относительный путь:

~/playground/anotherplace$ rm target ~/playground/anotherplace$ ln -s ../linkyland/sauce target ~/playground/anotherplace$ file target target: symbolic link to ../linkyland/sauce

Таким образом, идея о том, что нам нужны абсолютные пути ... просто неправильно. Нам нужен правильный путь, абсолютный или относительный.

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

~/playground/anotherplace$ cd ../linkyland ~/playground/linkyland$ ln -s /home/zanna/playground/linkyland/sauce target2 ~/playground/linkyland$ cd .. ~/playground$ mv linkyland elsewhere ~/playground$ file elsewhere/target* elsewhere/target: symbolic link to sauce elsewhere/target2: broken symbolic link to /home/zanna/playground/linkyland/sauce

Поэтому часто предпочтительнее использовать относительные пути , Однако, если местоположение исходного файла вряд ли изменится, но расположение символьной ссылки correct может измениться, было бы предпочтительным использовать абсолютный путь:

~/playground$ cd anotherplace ~/playground/anotherplace$ ln -s ../elsewhere/sauce target-rel ~/playground/anotherplace$ ln -s /home/zanna/playground/elsewhere/sauce target-abs ~/playground/anotherplace$ cd .. ~/playground$ mv anotherplace .. ~/playground$ cd .. ~$ file anotherplace/* anotherplace/target-abs: symbolic link to /home/zanna/playground/elsewhere/sauce anotherplace/target-rel: broken symbolic link to ../elsewhere/sauce
5
ответ дан 17 July 2018 в 23:28

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

zanna@toaster:~/playground$ mkdir linkyland anotherplace zanna@toaster:~/playground$ cd linkyland zanna@toaster:~/playground/linkyland$ ln -s sauce target zanna@toaster:~/playground/linkyland$ file * target: broken symbolic link to sauce

ln не волнует, существует ли исходный файл (поэтому, если вы делаете опечатку на пути, он не будет жаловаться) , Давайте создадим файл, к которому хотим привязать, и посмотрим, поможет ли это:

zanna@toaster:~/playground/linkyland$ > sauce zanna@toaster:~/playground/linkyland$ file target target: symbolic link to sauce

Теперь ссылка работает. Мы можем использовать только basename (последний элемент пути), потому что sauce находится в том же каталоге, что и target, поэтому target может хранить путь sauce, и этого достаточно, чтобы найти sauce когда нам это нужно.

zanna@toaster:~/playground/linkyland$ cd ../anotherplace zanna@toaster:~/playground/anotherplace$ ln -s sauce target zanna@toaster:~/playground/anotherplace$ file target target: broken symbolic link to sauce

Эта символическая ссылка не работает, потому что здесь нет sauce. Путь sauce недостаточно информации. (С этого момента я удалил часть user@host моего приглашения для упрощения чтения, но я показываю часть, которая указывает текущий рабочий каталог, так как это показывает, как работают команды.). Мы можем исправить это, используя абсолютный путь для создания символической ссылки:

~/playground/anotherplace$ rm target ~/playground/anotherplace$ ls -s /home/zanna/playground/linkyland/sauce target ~/playground/anotherplace$ file target target: symbolic link to /home/zanna/playground/linkyland/sauce

Однако мы могли бы также исправить это, сделав правильный относительный путь:

~/playground/anotherplace$ rm target ~/playground/anotherplace$ ln -s ../linkyland/sauce target ~/playground/anotherplace$ file target target: symbolic link to ../linkyland/sauce

Таким образом, идея о том, что нам нужны абсолютные пути ... просто неправильно. Нам нужен правильный путь, абсолютный или относительный.

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

~/playground/anotherplace$ cd ../linkyland ~/playground/linkyland$ ln -s /home/zanna/playground/linkyland/sauce target2 ~/playground/linkyland$ cd .. ~/playground$ mv linkyland elsewhere ~/playground$ file elsewhere/target* elsewhere/target: symbolic link to sauce elsewhere/target2: broken symbolic link to /home/zanna/playground/linkyland/sauce

Поэтому часто предпочтительнее использовать относительные пути , Однако, если местоположение исходного файла вряд ли изменится, но расположение символьной ссылки correct может измениться, было бы предпочтительным использовать абсолютный путь:

~/playground$ cd anotherplace ~/playground/anotherplace$ ln -s ../elsewhere/sauce target-rel ~/playground/anotherplace$ ln -s /home/zanna/playground/elsewhere/sauce target-abs ~/playground/anotherplace$ cd .. ~/playground$ mv anotherplace .. ~/playground$ cd .. ~$ file anotherplace/* anotherplace/target-abs: symbolic link to /home/zanna/playground/elsewhere/sauce anotherplace/target-rel: broken symbolic link to ../elsewhere/sauce
5
ответ дан 24 July 2018 в 13:59

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

zanna@toaster:~/playground$ mkdir linkyland anotherplace zanna@toaster:~/playground$ cd linkyland zanna@toaster:~/playground/linkyland$ ln -s sauce target zanna@toaster:~/playground/linkyland$ file * target: broken symbolic link to sauce

ln не волнует, существует ли исходный файл (поэтому, если вы делаете опечатку на пути, он не будет жаловаться) , Давайте создадим файл, к которому хотим привязать, и посмотрим, поможет ли это:

zanna@toaster:~/playground/linkyland$ > sauce zanna@toaster:~/playground/linkyland$ file target target: symbolic link to sauce

Теперь ссылка работает. Мы можем использовать только basename (последний элемент пути), потому что sauce находится в том же каталоге, что и target, поэтому target может хранить путь sauce, и этого достаточно, чтобы найти sauce когда нам это нужно.

zanna@toaster:~/playground/linkyland$ cd ../anotherplace zanna@toaster:~/playground/anotherplace$ ln -s sauce target zanna@toaster:~/playground/anotherplace$ file target target: broken symbolic link to sauce

Эта символическая ссылка не работает, потому что здесь нет sauce. Путь sauce недостаточно информации. (С этого момента я удалил часть user@host моего приглашения для упрощения чтения, но я показываю часть, которая указывает текущий рабочий каталог, так как это показывает, как работают команды.). Мы можем исправить это, используя абсолютный путь для создания символической ссылки:

~/playground/anotherplace$ rm target ~/playground/anotherplace$ ls -s /home/zanna/playground/linkyland/sauce target ~/playground/anotherplace$ file target target: symbolic link to /home/zanna/playground/linkyland/sauce

Однако мы могли бы также исправить это, сделав правильный относительный путь:

~/playground/anotherplace$ rm target ~/playground/anotherplace$ ln -s ../linkyland/sauce target ~/playground/anotherplace$ file target target: symbolic link to ../linkyland/sauce

Таким образом, идея о том, что нам нужны абсолютные пути ... просто неправильно. Нам нужен правильный путь, абсолютный или относительный.

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

~/playground/anotherplace$ cd ../linkyland ~/playground/linkyland$ ln -s /home/zanna/playground/linkyland/sauce target2 ~/playground/linkyland$ cd .. ~/playground$ mv linkyland elsewhere ~/playground$ file elsewhere/target* elsewhere/target: symbolic link to sauce elsewhere/target2: broken symbolic link to /home/zanna/playground/linkyland/sauce

Поэтому часто предпочтительнее использовать относительные пути , Однако, если местоположение исходного файла вряд ли изменится, но расположение символьной ссылки correct может измениться, было бы предпочтительным использовать абсолютный путь:

~/playground$ cd anotherplace ~/playground/anotherplace$ ln -s ../elsewhere/sauce target-rel ~/playground/anotherplace$ ln -s /home/zanna/playground/elsewhere/sauce target-abs ~/playground/anotherplace$ cd .. ~/playground$ mv anotherplace .. ~/playground$ cd .. ~$ file anotherplace/* anotherplace/target-abs: symbolic link to /home/zanna/playground/elsewhere/sauce anotherplace/target-rel: broken symbolic link to ../elsewhere/sauce
5
ответ дан 24 July 2018 в 17:02

Символическим ссылкам не нужны абсолютные пути. Он отлично работает с относительными путями:

$ ls -l /usr/bin/X11
lrwxrwxrwx 1 root root 1 May 11  2017 /usr/bin/X11 -> .

См. Здесь символическая ссылка на относительный путь, который отлично работает:

$ realpath /usr/bin/X11/yes
/usr/bin/yes
$ file /usr/bin/X11/yes
/usr/bin/X11/yes: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=add2c9ee02a98b5066d08d5ba2e79697880b2662, stripped
3
ответ дан 22 May 2018 в 15:38

Символическим ссылкам не нужны абсолютные пути. Он отлично работает с относительными путями:

$ ls -l /usr/bin/X11 lrwxrwxrwx 1 root root 1 May 11 2017 /usr/bin/X11 -> .

См. Здесь символическая ссылка на относительный путь, который отлично работает:

$ realpath /usr/bin/X11/yes /usr/bin/yes $ file /usr/bin/X11/yes /usr/bin/X11/yes: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=add2c9ee02a98b5066d08d5ba2e79697880b2662, stripped
3
ответ дан 17 July 2018 в 23:28

Символическим ссылкам не нужны абсолютные пути. Он отлично работает с относительными путями:

$ ls -l /usr/bin/X11 lrwxrwxrwx 1 root root 1 May 11 2017 /usr/bin/X11 -> .

См. Здесь символическая ссылка на относительный путь, который отлично работает:

$ realpath /usr/bin/X11/yes /usr/bin/yes $ file /usr/bin/X11/yes /usr/bin/X11/yes: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=add2c9ee02a98b5066d08d5ba2e79697880b2662, stripped
3
ответ дан 24 July 2018 в 13:59

Символическим ссылкам не нужны абсолютные пути. Он отлично работает с относительными путями:

$ ls -l /usr/bin/X11 lrwxrwxrwx 1 root root 1 May 11 2017 /usr/bin/X11 -> .

См. Здесь символическая ссылка на относительный путь, который отлично работает:

$ realpath /usr/bin/X11/yes /usr/bin/yes $ file /usr/bin/X11/yes /usr/bin/X11/yes: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=add2c9ee02a98b5066d08d5ba2e79697880b2662, stripped
3
ответ дан 24 July 2018 в 17:02

Другие вопросы по тегам:

Похожие вопросы: