From c089ff4a3ac9e7a30370b3b59f196a186ceb8bd5 Mon Sep 17 00:00:00 2001 From: Ain <41307858+nero@users.noreply.github.com> Date: Fri, 16 Mar 2018 04:18:57 +0000 Subject: [PATCH] Add commentary, fix broken relative symlink resolution --- realpath.sh | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/realpath.sh b/realpath.sh index 38ddfa9..214ae02 100755 --- a/realpath.sh +++ b/realpath.sh @@ -14,37 +14,49 @@ result="" while [ -n "$left" ]; do case "$left" in */*) + # Snip one path segment off $left seg="${left%%/*}" left="${left#*/}" ;; *) + # Last path segment already seg="$left" left="" ;; esac + case "$seg" in .) + # /foo/a -> . will become /foo result="${result%/*}" continue ;; ..) + # /foo/bar/a -> .. will become /foo result="${result%/*/*}" continue ;; esac + result="$result/$seg" target="$(readlink "$result")" + case "$target" in /*) - left="${target}" + # Absolute symlink. Resets buildup of $result + left="${target}/${left}" result="" ;; '') + # Readlink failed, its not a symlink ;; *) - left="${left%/*}/${target}" + # Relative symlink: Keep $result, its the symlink base + left="${target}/${left}" ;; esac + + # Make sure $left never starts with a slash left="${left#/}" done