github.com/m3db/m3@v1.5.0/scripts/realpath.sh (about) 1 #!/bin/bash 2 # adpated from https://github.com/mkropat/sh-realpath 3 4 realpath() { 5 canonicalize_path "$(resolve_symlinks "$1")" 6 } 7 8 resolve_symlinks() { 9 _resolve_symlinks "$1" 10 } 11 12 _resolve_symlinks() { 13 _assert_no_path_cycles "$@" || return 14 15 local dir_context path 16 path=$(readlink -- "$1") 17 if [ $? -eq 0 ]; then 18 dir_context=$(dirname -- "$1") 19 _resolve_symlinks "$(_prepend_dir_context_if_necessary "$dir_context" "$path")" "$@" 20 else 21 printf '%s\n' "$1" 22 fi 23 } 24 25 _prepend_dir_context_if_necessary() { 26 if [ "$1" = . ]; then 27 printf '%s\n' "$2" 28 else 29 _prepend_path_if_relative "$1" "$2" 30 fi 31 } 32 33 _prepend_path_if_relative() { 34 case "$2" in 35 /* ) printf '%s\n' "$2" ;; 36 * ) printf '%s\n' "$1/$2" ;; 37 esac 38 } 39 40 _assert_no_path_cycles() { 41 local target path 42 43 target=$1 44 shift 45 46 for path in "$@"; do 47 if [ "$path" = "$target" ]; then 48 return 1 49 fi 50 done 51 } 52 53 canonicalize_path() { 54 if [ -d "$1" ]; then 55 _canonicalize_dir_path "$1" 56 else 57 _canonicalize_file_path "$1" 58 fi 59 } 60 61 _canonicalize_dir_path() { 62 (cd "$1" 2>/dev/null && pwd -P) 63 } 64 65 _canonicalize_file_path() { 66 local dir file 67 dir=$(dirname -- "$1") 68 file=$(basename -- "$1") 69 (cd "$dir" 2>/dev/null && printf '%s/%s\n' "$(pwd -P)" "$file") 70 }