使用bash解析路径
我在MacOS上,但正在寻找一种跨平台的解决方案,它也可用于* nix。简单的问题,我该如何用bash脚本解决这个问题?使用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
实用程序没有-f
选项,* nix实用程序可能会这样做,所以我似乎无法使用该选项。
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
Idk取决于程序解释路径,并非所有程序都能正确解释它 –
readlink -m在mac上不可用TMK –
目前,我解决了它这种方式
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'完全能够处理这样的任务。正如@Cyrus在主要问题评论中指出的那样,你可以执行以下操作:'MYPATH =/some/stuff /../ otherstuff/a.sh; RESOLVED =“$(cd $(dirname $ MYPATH)&& pwd)/ $(basename $ MYPATH)”' – Aserre
让我试试你的解决方案。 –
好吧,你的想法似乎工作,我明白了它为什么,随意添加它作为答案 –
参见:从脚本中获取一个bash脚本的电流/当前工作目录(http://stackoverflow.com/q/59895/3776858) – Cyrus
只是试图从那里一些东西 - 可以你详细说明你认为会对我有何帮助的答案? –
我想第一个答案可以帮助你在你的脚本中:'DIR =“$(cd”$(dirname“$ {BASH_SOURCE [0]}”)“&& pwd)”'。我没有办法用MacOS和bash来测试它们。 – Cyrus