स्वयं संपादित करें, मैंने अभी देखा कि ओपी ने कहा कि वह सहानुभूति की तलाश नहीं कर रहा है:
"लेकिन मेरे द्वारा लिखे गए कार्यों के लिए मुझे उन रास्तों की आवश्यकता है जो निरपेक्ष हैं, लेकिन उनके सिम्बल को हल नहीं किया गया है।"
तो लगता है कि यह सब के बाद अपने सवाल के लिए इतना apropos नहीं है। :)
चूँकि मैंने वर्षों में कई बार इसमें भाग लिया है, और इस बार मेरे चारों ओर एक शुद्ध बैश पोर्टेबल संस्करण की आवश्यकता थी जिसे मैं OSX और लिनक्स पर उपयोग कर सकता था, मैंने आगे बढ़कर एक लिखा:
जीवित संस्करण यहां रहता है:
https://github.com/keen99/shell-functions/tree/master/resolve_path
लेकिन एसओ के लिए, यहाँ वर्तमान संस्करण है (मुझे लगता है कि यह अच्छी तरह से परीक्षण किया गया है..लेकिन मैं प्रतिक्रिया के लिए खुला हूँ!)
यह सादे बोर्न शेल (श) के लिए काम करना मुश्किल नहीं हो सकता है, लेकिन मैंने कोशिश नहीं की ... मुझे $ 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
}
यहाँ एक उत्कृष्ट उदाहरण है, काढ़ा करने के लिए धन्यवाद:
%% 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