Как создать символическую ссылку, которая работает относительно рабочего каталога
Рассмотреть следующее:
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