在这里,“规范化”基本上是指将文件路径转换为其最简单或“规范”形式的过程。例如, 的规范形式/foo/.//bar/../baz/
是/foo/baz
。
对于绝对路径,zsh 的:a
修饰符在这方面做得很好:
% printf -- '%s\n%s\n' "${WILDABSPATH}" "${WILDABSPATH:a}"
/foo/.//bar/../baz/
/foo/baz
不幸的是,对于相对文件路径,:a
修饰符的作用太多,因为它将文件路径转换为绝对路径。
% printf -- '%s\n%s\n' "${WILDRELPATH}" "${WILDRELPATH:a}"
./foo/.//bar/../baz/
/tmp/foo/baz
使用最后一个例子,有没有好的方法可以转换${WILDRELPATH}
为foo/baz
?
我想我的问题的一个答案可能是这样的
[[ ${ORIGINAL} == /* ]] \
&& CANONICAL=${ORIGINAL:a} \
|| CANONICAL=${${ORIGINAL:a}#$PWD/}
有没有更简单的?
答案1
我相信可以使用 来解决这个问题realpath
。
您可以执行以下操作...
realpath -m --relative-to=./ ./foo/.//bar/../baz/ # Outputs foo/baz
# or
realpath -m /foo/.//bar/../baz/ # Outputs /foo/baz