Разрешающий путь с bash

Я нахожусь на 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 Утилита не имеет -f вариант, который, вероятно, делает утилита * nix, поэтому я не могу использовать это.

2 ответа

Решение

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и возвращает имя файла.
  • так как все эти инструкции были выполнены в кратчайшие сроки, мы на самом деле не 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

На данный момент я решил это так

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 совсем не круто. Тот факт, что я должен прибегнуть к такого рода махинациям, является нелепым.

Другие вопросы по тегам