Неоднозначность пути через символические ссылки - PullRequest
0 голосов
/ 11 мая 2018

Я заметил странное поведение в системах UNIX:

I'm standing in /noob/
I have a symbolic link to a folder (A@ -> /B/C/D/A)
I enter the folder via my symlink (cd A) 
pwd says /noob/A/
In /B/C/D/A/ i have a file abc which I can see now.
I want to copy it to /noob/
I type cp abc ..
I type cd ..
I end up in /noob/ which is empty - but the file ended up in /B/C/D/ ???

Как возникла эта двусмысленность относительно того, где указываются cp и cd, когда они приводятся .. в качестве аргумента?Я нахожу это запутанным.Кто-нибудь может объяснить это в терминах, которые я пойму?(= просто)

Всего наилучшего, и, пожалуйста, простите UNIX-нубу глупый вопрос.Лассе

1 Ответ

0 голосов
/ 11 мая 2018

Сначала давайте посмотрим, как команда cd ведет себя, посмотрев в меню help. То, что мы ищем, это опция -L (поведение по умолчанию) и опция -P

$ help cd cd: cd [-L|[-P [-e]] [-@]] [dir]
Change the shell working directory.

...
...

Options:
    -L      force symbolic links to be followed: resolve symbolic links in
    DIR after processing instances of `..'
    -P      use the physical directory structure without following symbolic
    links: resolve symbolic links in DIR before processing instances
    of `..'
...
...

Важный раздел

The default is to follow symbolic links, as if `-L' were specified.
`..' is processed by removing the immediately previous pathname component
back to a slash or the beginning of DIR.

Exit Status:
...

Как вы можете видеть, поведение по умолчанию cd отличается от того, что вы думаете, поскольку он будет манипулировать переменной $PWD, к которой обращается команда pwd, по-своему, на каждом шаге вы можете запускать pwd введите команду или выполните команду echo $PWD, чтобы увидеть, как она реагирует с различными командами cd, указанными ниже.

Давайте поиграем с cd командой:

Мы начинаем со следующей папки со ссылкой sym:

[/home/arobert/test/noob] >
ls -ltra
total 8
drwxrwxr-x 5 arobert arobert 4096  5月 11 09:48 ..
lrwxrwxrwx 1 arobert arobert   26  5月 11 09:48 A -> /home/arobert/link/B/C/D/A
drwxrwxr-x 2 arobert arobert 4096  5月 11 10:03 .

ПРИМЕРЫ ИСПОЛЬЗОВАНИЯ:

[/home/arobert/test/noob] >
cd A
[/home/arobert/test/noob/A] >
cd ..
[/home/arobert/test/noob] >
cd -L A
[/home/arobert/test/noob/A] >
cd ..
[/home/arobert/test/noob] >
cd -P A
[/home/arobert/link/B/C/D/A] >
cd -P ..
[/home/arobert/link/B/C/D] >
cd /home/arobert/test/noob/
[/home/arobert/test/noob] >
cd A
[/home/arobert/test/noob/A] >
cd -P ..
[/home/arobert/link/B/C/D] >

Теперь давайте поиграем с readlink и cp командой:

Допустим, мы ввели символическую ссылку, указывающую на A -> /home/arobert/link/B/C/D/A, в которой у нас есть файл a

[/home/arobert/test/noob/A] >
ls -ltra
total 8
drwxrwxr-x 3 arobert arobert 4096  5月 11 09:55 ..
-rw-rw-r-- 1 arobert arobert    0  5月 11 10:10 a
drwxrwxr-x 2 arobert arobert 4096  5月 11 10:10 .

из этой папки давайте посмотрим, куда указывают . и .. с помощью команды readlink -f:

[/home/arobert/test/noob/A] >
readlink -f .
/home/arobert/link/B/C/D/A

[/home/arobert/test/noob/A] >
readlink -f ..
/home/arobert/link/B/C/D

В результате при запуске из /home/arobert/test/noob/A местоположения, эквивалентного /home/arobert/link/B/C/D/A, команда cp a .. файла будет перемещена в /home/arobert/link/B/C/D, поскольку .. указывает на него.

Что вы можете сделать сейчас:

  • Используйте абсолютный путь с вашей командой cp, чтобы избежать неприятных сюрпризов.
  • Вызовите команду из каталога /home/arobert/test/noob/, используя

Например:

[/home/arobert/test/noob] >
cp A/a .

как readlink -f . указывает на правильную папку

[/home/arobert/test/noob] >
readlink -f .
/home/arobert/test/noob

Результат:

[/home/arobert/test/noob] >
ls -ltra
total 8
drwxrwxr-x 5 arobert arobert 4096  5月 11 09:48 ..
lrwxrwxrwx 1 arobert arobert   26  5月 11 09:48 A -> /home/arobert/link/B/C/D/A
-rw-rw-r-- 1 arobert arobert    0  5月 11 10:13 a
drwxrwxr-x 2 arobert arobert 4096  5月 11 10:13 .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...