2016-11-25 122 views
-1

我在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实用程序可能会这样做,所以我似乎无法使用该选项。

+0

参见:从脚本中获取一个bash脚本的电流/当前工作目录(http://stackoverflow.com/q/59895/3776858) – Cyrus

+0

只是试图从那里一些东西 - 可以你详细说明你认为会对我有何帮助的答案? –

+1

我想第一个答案可以帮助你在你的脚本中:'DIR =“$(cd”$(dirname“$ {BASH_SOURCE [0]}”)“&& pwd)”'。我没有办法用MacOS和bash来测试它们。 – Cyrus

回答

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 
+0

Idk取决于程序解释路径,并非所有程序都能正确解释它 –

+0

readlink -m在mac上不可用TMK –

-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 凉的。我不得不求助于这些恶棍的事实是无稽之谈。

+2

您正在过度复杂化该问题。 'bash'完全能够处理这样的任务。正如@Cyrus在主要问题评论中指出的那样,你可以执行以下操作:'MYPATH =/some/stuff /../ otherstuff/a.sh; RESOLVED =“$(cd $(dirname $ MYPATH)&& pwd)/ $(basename $ MYPATH)”' – Aserre

+0

让我试试你的解决方案。 –

+0

好吧,你的想法似乎工作,我明白了它为什么,随意添加它作为答案 –