用bash解析路径
我在MacOS上,但正在寻找一个跨平台的解决方案,它也可以在*nix上工作。简单的问题是,如何使用bash脚本解析此路径用bash解析路径,bash,sh,readlink,Bash,Sh,Readlink,我在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 及 获得代表这两条路径分辨率的绝对路径的最佳方法是什么 请注意,我的Mac电脑上有
/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
及
获得代表这两条路径分辨率的绝对路径的最佳方法是什么
请注意,我的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
更改我们获得的目录,并且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
请看:刚刚从那里尝试了一些东西-您能详细说明您认为对我有帮助的答案吗?我想第一个答案可以在您的脚本中帮助您:
DIR=“$(cd“$(dirname“${BASH_SOURCE[0]}”)”&&pwd)”
。我没有办法用MacOS和bash测试它们。出于我的目的,我可以从简单的$(dirname“$0”)中获得相同的值,这不是我需要的,我不认为为什么它需要“解决”/Users/Olegzandr/.nvm/versions/node/v7.2.0/bin/。/lib/node_modules/suman/cli/cli.sh
是一个非常好的路径,它引用了与/Users/Olegzandr/.nvm/versions/node/v7.2.0/lib/node_modules/suman/cli/cli.sh相同的文件。您正在过度复制这个问题bash
完全能够处理这样的任务。正如@Cyrus在主要问题评论中指出的,您可以执行以下操作:MYPATH=/some/stuff/。/otherstuff/a.sh;RESOLVED=“$(cd$(dirname$MYPATH)和&pwd)/$(basename$MYPATH)”
让我试试你的解决方案。好吧,你的想法似乎有效,我明白了为什么,请随意添加它作为答案。Bash完全能够解决问题(有四个实用程序=>dirname、pwd、cd和basename)LOL fmlto公平点说,我用我熟悉的工具回答。但是,readlink
似乎可以很好地使用-m
标志(看看我编辑的答案)。此标志在mac上可用吗?Idk取决于解释路径的程序,并非所有程序都能正确解释路径
readlink -m /home/myusername/Documents/test_dir/dir_1/../dir_2/test.sh
> /home/myusername/Documents/test_dir/dir_2/test.sh