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.
72 lines
1.4 KiB
72 lines
1.4 KiB
3 years ago
|
#!/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")
|
||
|
}
|