Monday, June 24, 2019

linux - Use a symbolic link to create a new symbolic link



I have 2 directories (FOO, LALA). I create a symbolic link in one of them like this




ln -s /etc/apache2 FOO/apache2


Afterwards I want to create another symlink, pointing to the same directory, but not using the initial directory but the symlink created. So I try



ln -s FOO/apache2 LALA/apache2


The problem is that the second link is invalid.




ls FOO/apache2


The above works and lists files in /etc/apache2



ls LALA/apache2


But this one doesn't. It just lists the link itself.

If I add a slash at the end of each ls



ls FOO/apache2/


Works as well.



ls LALA/apache2/



I get ls: cannot access LALA/apache2/: No such file or directory/






If instead of



ln -s FOO/apache2 LALA/apache2


I do




cd LALA ; ln -s ../FOO/apache2 apache2


Then the symlink is valid



Any idea what's the difference?







Initial question from here
https://stackoverflow.com/questions/10656666/use-a-symbolic-link-to-create-a-new-symbolic-link


Answer



The difference is that relative symlinks are resolved at access time, not creation time.






In your first example, if the link's name is /somedir/LALA/apache2 and its target is FOO/apache2, it will be resolved to /somedir/LALA/FOO/apache2 when accessing it.





link name: link target: absolute target:
"/somedir/LALA/apache2" + "FOO/apache2" = "/somedir/LALA/FOO/apache2"


In the second example, the link's name is same – /somedir/LALA/apache2 – but its target, ../FOO/apache2, is now resolved as:




link name: link target: absolute target:
"/somedir/LALA/apache2" + "../FOO/apache2" = "/somedir/LALA/../FOO/apache2"
→ "/somedir/FOO/apache2"






This means that you must always give "../FOO/apache2" as the target to ln -s when creating the second link, regardless of what directory you are currently in.



Note: In the latest version of coreutils, the ln command has a new option -r/--relative, which does the job for you. For example, ln -r -s FOO/apache2 LALA/apache2 would work correctly.



For older versions, you could hack something with realpath --strip --relative-to...
I wrote sym for my own use.


No comments:

Post a Comment

hard drive - Leaving bad sectors in unformatted partition?

Laptop was acting really weird, and copy and seek times were really slow, so I decided to scan the hard drive surface. I have a couple hundr...