Add commentary, fix broken relative symlink resolution
This commit is contained in:
parent
4e0af9dc0a
commit
c089ff4a3a
16
realpath.sh
16
realpath.sh
@ -14,37 +14,49 @@ result=""
|
|||||||
while [ -n "$left" ]; do
|
while [ -n "$left" ]; do
|
||||||
case "$left" in
|
case "$left" in
|
||||||
*/*)
|
*/*)
|
||||||
|
# Snip one path segment off $left
|
||||||
seg="${left%%/*}"
|
seg="${left%%/*}"
|
||||||
left="${left#*/}"
|
left="${left#*/}"
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
|
# Last path segment already
|
||||||
seg="$left"
|
seg="$left"
|
||||||
left=""
|
left=""
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
case "$seg" in
|
case "$seg" in
|
||||||
.)
|
.)
|
||||||
|
# /foo/a -> . will become /foo
|
||||||
result="${result%/*}"
|
result="${result%/*}"
|
||||||
continue
|
continue
|
||||||
;;
|
;;
|
||||||
..)
|
..)
|
||||||
|
# /foo/bar/a -> .. will become /foo
|
||||||
result="${result%/*/*}"
|
result="${result%/*/*}"
|
||||||
continue
|
continue
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
result="$result/$seg"
|
result="$result/$seg"
|
||||||
target="$(readlink "$result")"
|
target="$(readlink "$result")"
|
||||||
|
|
||||||
case "$target" in
|
case "$target" in
|
||||||
/*)
|
/*)
|
||||||
left="${target}"
|
# Absolute symlink. Resets buildup of $result
|
||||||
|
left="${target}/${left}"
|
||||||
result=""
|
result=""
|
||||||
;;
|
;;
|
||||||
'')
|
'')
|
||||||
|
# Readlink failed, its not a symlink
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
left="${left%/*}/${target}"
|
# Relative symlink: Keep $result, its the symlink base
|
||||||
|
left="${target}/${left}"
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
# Make sure $left never starts with a slash
|
||||||
left="${left#/}"
|
left="${left#/}"
|
||||||
done
|
done
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user