Selbstbearbeitung, ich habe gerade bemerkt, dass das OP sagte, er suche nicht nach gelösten Symlinks:
"Aber für die Funktionen, die ich geschrieben habe, brauche ich Pfade, die absolut sind, deren Symlinks jedoch nicht aufgelöst sind."
Vermutlich ist das doch nicht so passend für seine Frage. :) :)
Da ich im Laufe der Jahre oft darauf gestoßen bin und dieses Mal eine reine Bash-Portable-Version brauchte, die ich unter OSX und Linux verwenden konnte, schrieb ich eine:
Die lebende Version lebt hier:
https://github.com/keen99/shell-functions/tree/master/resolve_path
Aber um SO willen, hier ist die aktuelle Version (ich denke, sie ist gut getestet. Aber ich bin offen für Feedback!)
Es könnte nicht schwierig sein, es für eine einfache Bourne-Shell (sh) zum Laufen zu bringen, aber ich habe es nicht versucht ... Ich mag $ FUNCNAME zu sehr. :) :)
#!/bin/bash
resolve_path() {
local owd="$PWD"
local opath="$1"
local npath=""
local obase=$(basename "$opath")
local odir=$(dirname "$opath")
if [[ -L "$opath" ]]
then
cd $odir
npath=$(readlink "$obase")
if [[ -L $npath ]]
then
resolve_path "$npath"
return $?
elif [[ -f $npath ]]
then
nbase=$(basename $npath)
npath=$(dirname $npath)
cd "$npath"
ndir=$(pwd -P)
retval=0
elif [[ -d $npath ]]
then
cd "$npath"
ndir=$(pwd -P)
retval=0
else
echo "$FUNCNAME: ERROR: unknown condition inside link!!" >&2
echo "opath [[ $opath ]]" >&2
echo "npath [[ $npath ]]" >&2
return 1
fi
else
if ! [[ -e "$opath" ]]
then
echo "$FUNCNAME: $opath: No such file or directory" >&2
return 1
elif [[ -d "$opath" ]]
then
cd "$opath"
ndir=$(pwd -P)
retval=0
elif [[ -f "$opath" ]]
then
cd $odir
ndir=$(pwd -P)
nbase=$(basename "$opath")
retval=0
else
echo "$FUNCNAME: ERROR: unknown condition outside link!!" >&2
echo "opath [[ $opath ]]" >&2
return 1
fi
fi
echo -n "$ndir"
if [[ "x${nbase:=}" != "x" ]]
then
echo "/$nbase"
else
echo
fi
cd "$owd"
return $retval
}
Hier ist ein klassisches Beispiel, dank Brew:
%% ls -l `which mvn`
lrwxr-xr-x 1 draistrick 502 29 Dec 17 10:50 /usr/local/bin/mvn@ -> ../Cellar/maven/3.2.3/bin/mvn
Verwenden Sie diese Funktion und es wird der -real- Pfad zurückgegeben:
%% cat test.sh
. resolve_path.inc
echo
echo "relative symlinked path:"
which mvn
echo
echo "and the real path:"
resolve_path `which mvn`
%% test.sh
relative symlinked path:
/usr/local/bin/mvn
and the real path:
/usr/local/Cellar/maven/3.2.3/libexec/bin/mvn