Как создать символическую ссылку, которая работает относительно рабочего каталога

Рассмотреть следующее:

x/
    ph/
        file1.txt -> ./../file1.txt
    file1.txt
y/
    ph/ -> /x/ph/ (this is full absolute path of x/ph)
    file1.txt

/y/ph символическая ссылка для ph папка в x, а также file1.txtэто относительные символические ссылки.

это работает правильно в x папка однако, если вы откроете /y/ph/file1.txt вместо открытия /y/file1.txt это открывает /x/file1.txt

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

в соответствии с lnпомощь

Символьные ссылки могут содержать произвольный текст; если позже разрешено, относительная ссылка интерпретируется относительно его родительского каталога.

поэтому относительные ссылки относятся к фактическому пути к папке, а не к текущему рабочему каталогу. вопрос: есть ли обходные пути для этого?

прецедент:

mkdir x y x/ph
echo x1 > ./x/file1.txt
echo y1 > ./y/file1.txt
ln -s $(pwd)/x/ph ./y/ph
cd ./x/ph
ln -s ./../file1.txt
cd ../..
cat ./x/ph/file1.txt
cat ./y/ph/file1.txt

ожидаемый результат x1 y1 но вы получаете x1 x1

Редактировать:

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

bor@borpc:~/tmp$ readlink -f ./x/ph/file.txt
/home/bor/tmp/x/ph/file.txt
bor@borpc:~/tmp$ readlink -f ./y/ph/file.txt
/home/bor/tmp/x/ph/file.txt
--------------^

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

если это возможно, как можно достичь такого поведения.

2 ответа

Я немного смущен. Вы можете сделать символическую ссылку, начиная с корневого каталога (я имею в виду /). Например,

ln -s /root/try/d s

ls -l  
total 0  

-rw-r--r-- 1 root root  0 Apr 24 16:15 d  
lrwxrwxrwx 1 root root 11 Apr 24 16:18 s -> /root/try/d  

Вы не можете сделать это с символическими ссылками. Симлинки так не работают. Относительная символическая ссылка будет относиться к самому файлу ссылки, а не к пути, по которому вы находитесь.

Однако вы можете добиться чего-то подобного с помощью bind mount:

      [you@example example]$ mkdir x y x/ph y/ph
[you@example example]$ echo x1 > ./x/file1.txt
[you@example example]$ echo y1 > ./y/file1.txt
[you@example example]$ sudo mount --bind ./x/ph ./y/ph
[you@example example]$ cd ./x/ph
[you@example ph]$ ln -s ../file1.txt
[you@example ph]$ cd ../..
[you@example example]$ cat ./x/ph/file1.txt
x1
[you@example example]$ cat ./y/ph/file1.txt
y1
Другие вопросы по тегам