autoedición, acabo de notar que el OP dijo que no está buscando enlaces simbólicos resueltos:
"Pero para las funciones que he escrito, necesito rutas que sean absolutas, pero no resuelvan sus enlaces simbólicos".
Así que supongo que, después de todo, esto no es tan apropiado para su pregunta. :)
Como me he encontrado con esto muchas veces a lo largo de los años, y esta vez necesitaba una versión portátil pura de bash que pudiera usar en OSX y Linux, seguí adelante y escribí una:
La versión viva vive aquí:
https://github.com/keen99/shell-functions/tree/master/resolve_path
pero por el bien de SO, aquí está la versión actual (creo que está bien probada ... ¡pero estoy abierto a recibir comentarios!)
Puede que no sea difícil hacerlo funcionar para bourne shell simple (sh), pero no lo intenté ... Me gusta demasiado $ FUNCNAME. :)
#!/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
}
aquí hay un ejemplo clásico, gracias a 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
use esta función y devolverá la ruta -real-:
%% 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