You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
71 lines
1.4 KiB
71 lines
1.4 KiB
#!/usr/bin/env bash |
|
|
|
# Based on realpath.sh written by Michael Kropat |
|
# Found at: https://github.com/mkropat/sh-realpath/blob/65512368b8155b176b67122aa395ac580d9acc5b/realpath.sh |
|
|
|
bash_realpath() { |
|
canonicalize_path "$(resolve_symlinks "$1")" |
|
} |
|
|
|
resolve_symlinks() { |
|
_resolve_symlinks "$1" |
|
} |
|
|
|
_resolve_symlinks() { |
|
_assert_no_path_cycles "$@" || return |
|
|
|
local dir_context path |
|
if path=$(readlink -- "$1"); then |
|
dir_context=$(dirname -- "$1") |
|
_resolve_symlinks "$(_prepend_dir_context_if_necessary "$dir_context" "$path")" "$@" |
|
else |
|
printf '%s\n' "$1" |
|
fi |
|
} |
|
|
|
_prepend_dir_context_if_necessary() { |
|
if [ "$1" = . ]; then |
|
printf '%s\n' "$2" |
|
else |
|
_prepend_path_if_relative "$1" "$2" |
|
fi |
|
} |
|
|
|
_prepend_path_if_relative() { |
|
case "$2" in |
|
/* ) printf '%s\n' "$2" ;; |
|
* ) printf '%s\n' "$1/$2" ;; |
|
esac |
|
} |
|
|
|
_assert_no_path_cycles() { |
|
local target path |
|
|
|
target=$1 |
|
shift |
|
|
|
for path in "$@"; do |
|
if [ "$path" = "$target" ]; then |
|
return 1 |
|
fi |
|
done |
|
} |
|
|
|
canonicalize_path() { |
|
if [ -d "$1" ]; then |
|
_canonicalize_dir_path "$1" |
|
else |
|
_canonicalize_file_path "$1" |
|
fi |
|
} |
|
|
|
_canonicalize_dir_path() { |
|
(cd "$1" 2>/dev/null && pwd -P) |
|
} |
|
|
|
_canonicalize_file_path() { |
|
local dir file |
|
dir=$(dirname -- "$1") |
|
file=$(basename -- "$1") |
|
(cd "$dir" 2>/dev/null && printf '%s/%s\n' "$(pwd -P)" "$file") |
|
}
|
|
|