-1

我在 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

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

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

4

2 回答 2

1

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返回最后没有文件名的路径
  • cd更改我们得到的目录,并pwd显示当前目录。
  • basename是 , 的反义词dirname,返回文件名。
  • 由于所有这些指令都在子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
于 2016-11-25T10:32:24.077 回答
-1

目前,我以这种方式解决了它

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 一点也不酷。我不得不诉诸这些恶作剧的事实是荒谬的。

于 2016-11-25T08:37:19.487 回答