Самостоятельное редактирование, я только что заметил, что OP сказал, что не ищет разрешенных символических ссылок:
«Но для функций, которые я написал, мне нужны абсолютные пути, но не разрешенные символические ссылки».
Так что угадайте, что это не совсем так по поводу его вопроса. :)
Поскольку я сталкивался с этим много раз на протяжении многих лет, и на этот раз мне нужна была портативная версия на чистом bash, которую я мог бы использовать в OSX и Linux, я пошел дальше и написал одну:
Здесь живет живая версия:
https://github.com/keen99/shell-functions/tree/master/resolve_path
но ради ТАК, вот текущая версия (я считаю, что она хорошо протестирована ... но я открыт для отзывов!)
Может быть нетрудно заставить его работать с простой оболочкой bourne (sh), но я не пробовал ... Мне слишком нравится $ 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
}
вот классический пример, благодаря 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
используйте эту функцию, и она вернет -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