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