2018-03-14 00:26:12 +01:00
|
|
|
#!/bin/sh
|
2018-03-16 05:07:09 +01:00
|
|
|
|
|
|
|
case "$1" in
|
2018-03-16 05:11:59 +01:00
|
|
|
/*)
|
|
|
|
left="${1#/}"
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
left="${PWD#/}/$1"
|
|
|
|
;;
|
2018-03-16 05:07:09 +01:00
|
|
|
esac
|
2018-03-14 00:26:12 +01:00
|
|
|
|
2018-03-16 05:10:20 +01:00
|
|
|
result=""
|
2018-03-14 00:26:12 +01:00
|
|
|
|
2018-03-16 05:10:20 +01:00
|
|
|
while [ -n "$left" ]; do
|
|
|
|
case "$left" in
|
2018-03-16 05:02:12 +01:00
|
|
|
*/*)
|
2018-03-16 05:18:57 +01:00
|
|
|
# Snip one path segment off $left
|
2018-03-16 05:10:20 +01:00
|
|
|
seg="${left%%/*}"
|
|
|
|
left="${left#*/}"
|
2018-03-16 05:02:12 +01:00
|
|
|
;;
|
|
|
|
*)
|
2018-03-16 05:18:57 +01:00
|
|
|
# Last path segment already
|
2018-03-16 05:10:20 +01:00
|
|
|
seg="$left"
|
|
|
|
left=""
|
2018-03-16 05:02:12 +01:00
|
|
|
;;
|
|
|
|
esac
|
2018-03-16 05:18:57 +01:00
|
|
|
|
2018-03-16 05:02:12 +01:00
|
|
|
case "$seg" in
|
|
|
|
.)
|
2018-03-16 05:18:57 +01:00
|
|
|
# /foo/a -> . will become /foo
|
2018-03-16 05:10:20 +01:00
|
|
|
result="${result%/*}"
|
2018-03-16 05:02:12 +01:00
|
|
|
continue
|
|
|
|
;;
|
|
|
|
..)
|
2018-03-16 05:18:57 +01:00
|
|
|
# /foo/bar/a -> .. will become /foo
|
2018-03-16 05:10:20 +01:00
|
|
|
result="${result%/*/*}"
|
2018-03-16 05:02:12 +01:00
|
|
|
continue
|
|
|
|
;;
|
|
|
|
esac
|
2018-03-16 05:18:57 +01:00
|
|
|
|
2018-03-16 05:10:20 +01:00
|
|
|
result="$result/$seg"
|
|
|
|
target="$(readlink "$result")"
|
2018-03-16 05:18:57 +01:00
|
|
|
|
2018-03-16 05:02:12 +01:00
|
|
|
case "$target" in
|
2018-03-16 05:11:59 +01:00
|
|
|
/*)
|
2018-03-16 05:18:57 +01:00
|
|
|
# Absolute symlink. Resets buildup of $result
|
|
|
|
left="${target}/${left}"
|
2018-03-16 05:11:59 +01:00
|
|
|
result=""
|
|
|
|
;;
|
|
|
|
'')
|
2018-03-16 05:18:57 +01:00
|
|
|
# Readlink failed, its not a symlink
|
2018-03-20 18:40:47 +01:00
|
|
|
# If file does not exist, exit
|
|
|
|
[ -e "$result" ] || exit 1
|
2018-03-16 05:11:59 +01:00
|
|
|
;;
|
|
|
|
*)
|
2018-03-16 05:18:57 +01:00
|
|
|
# Relative symlink: Keep $result, its the symlink base
|
|
|
|
left="${target}/${left}"
|
2018-03-16 05:21:43 +01:00
|
|
|
result="${result%/*}"
|
2018-03-16 05:11:59 +01:00
|
|
|
;;
|
2018-03-16 05:02:12 +01:00
|
|
|
esac
|
2018-03-16 05:18:57 +01:00
|
|
|
|
|
|
|
# Make sure $left never starts with a slash
|
2018-03-16 05:10:20 +01:00
|
|
|
left="${left#/}"
|
2018-03-16 05:02:12 +01:00
|
|
|
done
|
|
|
|
|
2018-03-16 05:24:15 +01:00
|
|
|
printf "%s\n" "$result"
|