LINUX.ORG.RU

Проблема с bash, символьными ссылками и путями.


0

1

Есть такая иерархия:

ls -lR /tmp/dir1

/tmp/dir1:
drwxr-xr-x    x1
drwxr-xr-x    x2

/tmp/dir1/x1:
drwxr-xr-x    bin
drwxr-xr-x    data

/tmp/dir1/x1/bin:
-rwxr-xr-x    run.sh

/tmp/dir1/x1/data:

/tmp/dir1/x2:
lrwxrwxrwx    bin -> ../x1/bin
drwxr-xr-x    data

/tmp/dir1/x2/data:

Скрипт run.sh:

#!/bin/sh

pwd
touch ../data/xxx

Запуск 1:

cd /tmp/dir1/x1/bin/
./run.sh 

Вывод:

/tmp/dir1/x1/bin

Файл xxx создался в каталоге /tmp/dir1/x1/data

Запуск 2:

cd /tmp/dir1/x2/bin
./run.sh

Вывод:

/tmp/dir1/x2/bin

Но файл опять создаётся в каталоге /tmp/dir1/x1/data!!!

Почему так происходит? Явно что-то не так делаю с символьными ссылками и относительными путями. Но что не так - не пойму.



Последнее исправление: ksicom (всего исправлений: 2)

заверни в [code]
невозможно прочитать :(

ii343hbka ★★★
()

при заходе вот сюда: /tmp/dir1/x2/bin ты по ссылке попадаешь вот сюда: /tmp/dir1/x1/bin. и уже там выполняешь скрипт. что не так?

ссылку делай на скрипт сам, а не на директорию скрипта или запускай с уровня выше.

anonymous
()
Ответ на: комментарий от kostik87

Он должен показывать текущий каталог

Получается, что текущий каталог, который выводит pwd и каталог, относительно которого «отсчитывается» ../data/xxx разные?

ksicom
() автор топика
Ответ на: комментарий от ksicom

Вы «пришли» в директорию по пути /tmp/dir1/x2/bin вот этот путь и отображается в выводе pwd.

kostik87 ★★★★★
()
Последнее исправление: kostik87 (всего исправлений: 1)
Ответ на: комментарий от kostik87

Он должен показывать текущий каталог

Получается, что текущий каталог, который выводит pwd и каталог, относительно которого «отсчитывается» ../data/xxx разные?

---

Усложним задачу. Скрипт:

#!/bin/sh

pwd
touch ../data/xxx
cd ..
pwd

Вывод 1:

/tmp/dir1/x1/bin
/tmp/dir1/x1

Вывод 2:

/tmp/dir1/x2/bin
/tmp/dir1/x2
ksicom
() автор топика
Ответ на: комментарий от ksicom

Вы понимаете что такое символьная ссылка ?

Если вы хотите видеть реальный путь в случае, если вы перешли в текущую директорию по символьной ссылке, то вызывайте pwd с ключом '-P'

pwd -P

Почитайте:

man pwd

kostik87 ★★★★★
()
Ответ на: комментарий от ksicom

Помимо символьной ссылки (symlink) есть ещё и жёсткая ссылка (hardlink), которая по факту является вторым именем файла и может создаваться только в пределах одной файловой системы. Если вы удаляете файл (директорию), на который ссылается символьная ссылка, то ссылка является испорченной (broken), т.к. данные, на которые она ссылалась удалены. В случае жёсткой ссылки при удалении файла (директории), на которые ссылается жёсткая ссылка данные остаются доступны по этой ссылке.

kostik87 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.