diff options
Diffstat (limited to 'pkgs/shell')
| -rwxr-xr-x | pkgs/shell/deref | 89 | 
1 files changed, 89 insertions, 0 deletions
| diff --git a/pkgs/shell/deref b/pkgs/shell/deref new file mode 100755 index 0000000..05da4ba --- /dev/null +++ b/pkgs/shell/deref @@ -0,0 +1,89 @@ +#! /bin/sh +#!buildShellBin prepend-path=coreutils:which +# +# NAME +#       deref - dereference a name or path, showing all intermediaries +# +# SYNOPSIS +#       deref [OPTION]... NAME... +# +# DESCRIPTION +#        +# +#       --show=asis, --show=as-is +#         When encountering relative file names, show them as-is. +#         This is the default behavior. +# +#       --show=all +#         When encountering relative file names, show them as-is +#         and additionally show their absolute file name. +# +#       --show=abs, --show=absolute +#         When encountering relative file names, show their absolute +#         file name. +# + +set -efu + +showname=asis +case $1 in +  (--show=asis|--show=as-is|--show=all|--show=abs|--show=absolute) +    showname=${1#--show=} +    shift +    ;; +  (-*) +    echo "$0: bad argument: $1" >&2 +    exit 1 +    ;; +esac + +showname() { +  if test -L "$1" || test -e "$1"; then +    case $1 in +      /*) +        ls -d --color "$1" +        ;; +      *) +        case $showname in +          asis|as-is) +            ls -d --color "$1" +            ;; +          abs|absolute) +            ls -d --color "$(realpath -sm "$1")" +            ;; +          all) +            echo "$(ls -d --color "$1")=$(ls -d --color "$(realpath -sm "$1")")" +            ;; +        esac +      ;; +    esac +  else +    printf '[31m%s[m' "$name" +  fi +} + +pwd=$PWD +for name; do +  cd "$pwd" +  path= +  sep= + +  if ! test -L "$name" && ! test -e "$name"; then +    if which=$(which "$name" 2>/dev/null); then +      path=$name +      sep=' ⇒ ' +      name=$which +    fi +  fi + +  while test -L "$name"; do +    cd "$(dirname "$name")" +    path=${path+$path$sep}$(showname "$name") +    sep=' → ' +    name=$(readlink "$name") +  done + +  path=${path+$path$sep}$(showname "$name") + +  echo "$path" +done | 
