samodzielna edycja, właśnie zauważyłem, że OP powiedział, że nie szuka rozwiązanych linków symbolicznych:
„Ale dla funkcji, które napisałem, potrzebuję ścieżek, które są bezwzględne, ale nie mają rozwiązanych dowiązań symbolicznych”.
Więc myślę, że to jednak nie jest tak odpowiednie do jego pytania. :)
Ponieważ przez lata napotykałem na to wiele razy, a tym razem potrzebowałem czystej przenośnej wersji bash, której mógłbym używać na OSX i Linuksie, napisałem jedną:
Żywa wersja mieszka tutaj:
https://github.com/keen99/shell-functions/tree/master/resolve_path
ale ze względu na SO, oto aktualna wersja (wydaje mi się, że jest dobrze przetestowana, ale jestem otwarty na opinie!)
Może nie być trudne, aby działał na zwykłej skorupie burne (sh), ale nie próbowałem ... Za bardzo lubię $ 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
}
oto klasyczny przykład, dzięki naparowi:
%% 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
użyj tej funkcji, a zwróci ona -real- ścieżkę:
%% 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