tự chỉnh sửa, tôi chỉ nhận thấy OP nói rằng anh ấy không tìm kiếm các liên kết tượng trưng được giải quyết:
"Nhưng đối với các chức năng tôi đã viết, tôi cần các đường dẫn tuyệt đối, nhưng không giải quyết các liên kết tượng trưng của chúng."
Vì vậy, đoán rằng đây không phải là điều quá khó hiểu đối với câu hỏi của anh ấy. :)
Vì tôi đã gặp phải vấn đề này nhiều lần trong nhiều năm và lần này tôi cần một phiên bản di động bash thuần túy mà tôi có thể sử dụng trên OSX và linux, tôi đã tiếp tục và viết một bản:
Phiên bản sống ở đây:
https://github.com/keen99/shell-functions/tree/master/resolve_path
nhưng vì lợi ích của VẬY, đây là phiên bản hiện tại (tôi cảm thấy nó đã được thử nghiệm tốt..nhưng tôi sẵn sàng nhận phản hồi!)
Có thể không khó để làm cho nó hoạt động với vỏ bourne đơn giản (sh), nhưng tôi đã không thử ... Tôi thích $ FUNCNAME quá. :)
#!/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
}
đây là một ví dụ cổ điển, nhờ bia:
%% 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
sử dụng hàm này và nó sẽ trả về đường dẫn -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