使用 bash 解析路径

Resolving path with bash

我在 MacOS,但正在寻找一个也适用于 *nix 的跨平台解决方案。简单的问题,如何使用 bash 脚本解决此路径?

/Users/Olegzandr/.nvm/versions/node/v7.2.0/bin/../lib/node_modules/suman/cli/cli.sh

这条路由我手头的两部分组成:

/Users/Olegzandr/.nvm/versions/node/v7.2.0/bin

../lib/node_modules/suman/cli/cli.sh

获得代表这两条路径分辨率的绝对路径的最佳方法是什么?

请注意,我的 Mac 上有 readlink,但它似乎与 *nix 机器上的实用程序不同。最重要的是,我的 readlink 实用程序没有 *nix 实用程序可能有的 -f 选项,所以我似乎无法使用它。

目前我是这样解决的

DIRN="/Users/Olegzandr/.nvm/versions/node/v7.2.0/bin"

EXECDIR="../lib/node_modules/suman/cli/cli.sh"

RESOLVED=$(node -e "var path = require('path'); process.stdout.write(path.resolve('$DIRN/$EXECDIR'))");

坦率地说,bash 一点也不 酷。我不得不诉诸这些恶作剧的事实是无稽之谈。

bash完全可以胜任这样的任务。从主要问题的评论中汲取灵感,你可以这样做:

MYPATH=/Users/Olegzandr/.nvm/versions/node/v7.2.0/bin/../lib/node_modules/suman/cli/cli.sh
RESOLVED="$(cd $(dirname $MYPATH) && pwd)/$(basename $MYPATH)"
  • dirname returns 末尾没有文件名的路径
  • cd更改为我们得到的目录,pwd显示当前目录。
  • basenamedirname相反,returns文件名
  • 因为所有这些指令都是在子 shell 中执行的,所以我们实际上并没有 cd 在我们的主脚本中

编辑:我使用我熟悉的工具给出了这个答案。但是,我刚刚查看了您在问题中提到的 readlink 实用程序。使用 -m 选项似乎对我来说效果很好。此标志在 mac 上可用吗?

readlink -m /home/myusername/Documents/test_dir/dir_1/../dir_2/test.sh
> /home/myusername/Documents/test_dir/dir_2/test.sh