summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/coreutils.texi18
-rwxr-xr-xtests/ln/relative.sh11
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