## POSIX compliant function to replace dirname dirname() { _dirname "$1" && printf "%s\n" "$_DIRNAME" } _dirname() { case $1 in --) shift ;; esac _DIRNAME=$1; strip_trailing_slashes; case $_DIRNAME in "") _DIRNAME='/' return ;; */*) _DIRNAME="${_DIRNAME%/*}" ;; *) _DIRNAME='.' ;; esac; strip_trailing_slashes; } strip_trailing_slashes () { while [ "${_DIRNAME%/}" != "$_DIRNAME" ]; do _DIRNAME=${_DIRNAME%/}; done }