解析相对路径而不解析bash中的符号链接

解析相对路径而不解析bash中的符号链接

我正在寻找一种可移植的方法来将相对路径解析为绝对路径,同时不解析任何符号链接。

例如,/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防止这些命令打印出它们默认执行的目录堆栈,这会破坏所需的输出

相关内容