使用bash解析路径

时间:2016-11-25 08:16:08

标签: bash sh readlink

On我在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选项,所以我似乎无法使用它。

2 个答案:

答案 0 :(得分: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显示当前目录。
  • basenamedirname相反,并返回文件名。
  • 由于所有这些说明都是在子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

答案 1 :(得分:-1)

目前,我这样解决了

{{1}}

坦率地说,bash 并非很酷。我不得不求助于这种恶作剧的事实是荒谬的。