【问题标题】:Resolving path with bash使用 bash 解析路径
【发布时间】:2017-04-09 14:02:20
【问题描述】:

我在 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 选项,所以我似乎无法使用它。

【问题讨论】:

  • 刚刚从那里尝试了一些东西 - 你能详细说明你认为那里的答案对我有帮助吗?
  • 我想第一个答案可以帮助您编写脚本: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 sh readlink


【解决方案1】:

bash 完全能够处理这样的任务。从主要问题 cmets 中获取灵感,您可以执行以下操作:

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

【讨论】:

  • Idk 取决于解释路径的程序,并非所有程序都能正确解释它
【解决方案2】:

暂时,我是这样解决的

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 在主要问题 cmets 中指出的那样,您可以执行以下操作:MYPATH=/some/stuff/../otherstuff/a.sh; RESOLVED="$(cd $(dirname $MYPATH) && pwd)/$(basename $MYPATH)"
  • 让我试试你的解决方案。
  • 好吧,你的想法似乎行得通,我明白为什么会这样,请随时将其添加为答案
  • bash 完全有能力解决这个问题(有四个实用程序 => dirname、pwd、cd 和 basename)LOL fml
  • 公平地说,我使用我熟悉的工具进行了回答。但是,readlink 似乎与-m 标志配合得很好(看看我编辑的答案)。这个标志在 mac 上可用吗?
猜你喜欢
  • 2023-04-10
  • 2015-02-14
  • 1970-01-01
  • 2023-04-01
  • 2017-06-29
  • 1970-01-01
  • 2014-01-15
  • 1970-01-01
相关资源
最近更新 更多