我正在寻找一种可移植的方法来将相对路径解析为绝对路径,同时不解析任何符号链接。
例如,/home/nat/cat/bat/hat.sh
在 bash 中运行以下文件:
set -x
pwd
# cat is a symlink
readlink -e ..
# abs is an imaginary function that returns the path in the form specified by this question
abs ..
abs /home/./nat/../nat/cat
输出:
+ pwd
/home/nat/cat/bat
+ readlink -e ..
/home/nat/cat-1.12.0
+ abs ..
/home/nat/cat
+ abs /home/./nat/../nat/cat
/home/nat/cat
不幸的是我不能使用realpath -s
它,因为它在 OSX 上默认不可用。
答案1
这就是你的虚函数看起来具体化的样子:
abs () {
local _PWD _BN
[ -d "${1}" ] && _PWD="${1}"
[ -f "${1}" ] && { _PWD=$(dirname "${1}") ; _BN=/$(basename "${1}") ;}
pushd $_PWD >/dev/null
echo $(pwd)${_BN}
popd >/dev/null
}
您可以传递文件或目录路径作为参数。然后它会转到指定的路径并打印出工作目录,这就是您想要的。您可能需要根据您的具体需求添加一些针对空参数、不存在路径或权限不足等的验证 - 我在本示例中省略了这一点。
两人pushd/popd
执行跳至目标并返回的动作
>/dev/null
防止这些命令打印出它们默认执行的目录堆栈,这会破坏所需的输出