В общем, это довольно сложно, так как у вас может быть символическая ссылка, такая как:
ln -s ../symlink/xyz pqr
где «символическая ссылка» сама является символической ссылкой произвольной длины. У меня есть программа, которая выполняет ту же работу, что и realpath()
но также проверяет безопасность всех символических ссылок на пути. Таким образом, он может быть использован для ответа на ваш вопрос. И некоторые из его тестовых сценариев могут быть использованы для проверки ваших расчетов.
Это один из таких тестов:
#!/bin/ksh
#
# @(#)$Id: realpathtest.sh,v 1.4 2008/04/14 19:36:54 jleffler Exp $
#
# Create confusing path names
base=${1:-"./rpt"}
mkdir -p $base/elsewhere/confused $base/elsewhere/hidden \
$base/other/place $base/elsewhere/private
(
cd $base
[ -h link ] || ln -s elsewhere/confused link
[ -h some ] || ln -s other/place some
)
(
cd $base/elsewhere/confused
[ -h mischief ] || ln -s ../hidden mischief
[ -h where ] || ln -s ../private where
)
(
cd $base/other/place
[ -h dubious ] || ln -s ../../link/mischief dubious
[ -h doubtful ] || ln -s ../../link/where doubtful
)
(
cd $base/elsewhere/private
echo "What is the real pathname for $base/some/doubtful/file?" > file
)
(
cd $base/elsewhere/hidden
[ -h file ] || ln -s name file
echo "What is the real pathname for $base/some/dubious/file?" > name
)
for name in \
$base/some/dubious/file \
$base/some/doubtful/file \
$base/elsewhere/confused/mischief/file \
$base/elsewhere/confused/where/file
do
if realpath $name
then cat $(realpath -s $name)
fi
done
Свяжитесь со мной, если вы хотите получить исходный текст программы 'realpath' или 'linkpath' (см. Мой профиль); , Программа 'realpath' не является ракетостроением - она в основном вызывает realpath()
для каждого заданного аргумента. Там значительно больше усилий, связанных с анализом полного набора ссылок.