使用 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
显示当前目录。
basename
与dirname
相反,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
我在 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
显示当前目录。basename
与dirname
相反,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