Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用bash解析路径_Bash_Sh_Readlink - Fatal编程技术网

用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电脑上有

我在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电脑上有
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