diff options
-rw-r--r-- | doc/coreutils.texi | 18 | ||||
-rwxr-xr-x | tests/ln/relative.sh | 11 |
2 files changed, 28 insertions, 1 deletions
diff --git a/doc/coreutils.texi b/doc/coreutils.texi index dfa9b1c21..4cfe4c50c 100644 --- a/doc/coreutils.texi +++ b/doc/coreutils.texi @@ -9798,8 +9798,24 @@ ln -srv /a/file /tmp '/tmp/file' -> '../a/file' @end smallexample +Relative symbolic links are generated based on their canonicalized +containing directory, and canonicalized targets. I.E. all symbolic +links in these file names will be resolved. @xref{realpath invocation}, which gives greater control -over relative file name generation. +over relative file name generation, as demonstrated in the following example: + +@example +@verbatim +ln--relative() { + test "$1" = --no-symlinks && { nosym=$1; shift; } + target="$1"; + test -d "$2" && link="$2/." || link="$2" + rtarget="$(realpath $nosym -m "$target" \ + --relative-to "$(dirname "$link")")" + ln -s -v "$rtarget" "$link" +} +@end verbatim +@end example @item -s @itemx --symbolic diff --git a/tests/ln/relative.sh b/tests/ln/relative.sh index 818da8392..8d4f1e7e0 100755 --- a/tests/ln/relative.sh +++ b/tests/ln/relative.sh @@ -34,4 +34,15 @@ ln -s dir1/dir2/f existing_link ln -srf here existing_link test $(readlink existing_link) = 'here' || fail=1 +# Demonstrate resolved symlinks used to generate relative links +# so here, 'web/latest' will not be linked to the intermediate 'latest' link. +# You'd probably want to use realpath(1) in conjunction +# with ln(1) without --relative to give greater control. +ln -s release1 alpha +ln -s release2 beta +ln -s beta latest +mkdir web +ln -sr latest web/latest +test $(readlink web/latest) = '../release2' || fail=1 + Exit $fail |