Как получить полностью разрешенный путь символической ссылки в Терминале?

47

У меня запутанная путаница установок Python на моем ноутбуке. Я смотрел на исполняемые файлы, /usr/local/binи все они являются символическими ссылками на../../../Library......

Вокруг этого странного поведения. Если я ls -lhaGувижу, я вижу --->и относительный путь справа от символических ссылок:

lrwxr-xr-x  1 root  wheel    69B Dec  7 22:29 python3 -> ../../../Library/Frameworks/Python.framework/Versions/3.1/bin/python3

Тем не менее, я не могу получить какие-либо инструменты командной строки для разрешения этого пути и отображения фактического пути к python3. Я нашел некоторые лакомые кусочки здесь и там относительно использования pwd -Pи findполезности для этого. Проблема в том, что они не работают на OS X так, как люди описывают их работу на Linux (т.е. выводят полный путь к символической ссылке). Они просто печатают путь символических ссылок для меня:

FantasticMrFox:bin robert$ pwd -P python3
/usr/local/bin
FantasticMrFox:bin robert$ find `pwd -P` -name python3
/usr/local/bin/python3

Есть идеи о том, что здесь происходит?

Роберт С Чаччо
источник

Ответы:

36

Я думаю, что pwd -Pи readlinkбуду твоими друзьями для этой задачи.

« Как узнать поведение readlink -f GNU на Mac? » - удобный ресурс.

pwd -P работает, только если вы находитесь в каталоге символических ссылок:

14:07:13 jason@mac ~ $ cd bin
14:08:08 jason@mac bin $ pwd -P
/Users/jason/Applications

readlink работает путем указания цели (таким образом, она может быть использована против файлов):

14:09:03 jason@mac ~ $ readlink bin
Applications

14:09:34 jason@mac ~ $ readlink /var
private/var

Вывод, по- readlinkвидимому, относительно родителя указанной цели.

Пример: Родитель /varявляется /, так private/varправильно, относительно /. Согласно моему приведенному выше примеру bin -> Applications, оба находятся в моем домашнем каталоге, независимо от того, где я его запускаю, вывод один и тот же.

Джейсон Салаз
источник
3
readlink не повторяется в том случае, когда символическая ссылка указывает на другие символические ссылки. Я бы не назвал это «полностью решенным»
Джеймс Рот
Похоже, что это не работает с вопросом OP о символических ссылках на вещи, указанные с такими вещами, как ../...
user124384
18

Это решает рекурсивно и возвращает абсолютный путь:

$ python
>>> import os
>>> os.path.realpath("/usr/local/bin/python3")

Или неинтерактивная версия:

python -c "import os; print(os.path.realpath('/usr/local/bin/python3'))"
Джеймс Рот
источник
1
Когда вам не удается встроиться, прибегайте к написанию сценариев ... Хорошо. Определенно работает: $ python -c "import os; print os.path.realpath('bin')">> /Users/jason/Applications. Я символическую ссылку ~ / bin на ~ / Applications, чтобы иметь единый .bash_profile / $ PATH для систем Mac и * nix.
Джейсон Салас
1
это здорово и хорошо работает! Я бы отметил его как ответ, за исключением того, что я также хочу знать, есть ли способ сделать это в оболочке, как вы можете это сделать в других * nix системах.
Роберт С. Чаччо
1
Как вы делаете это на других * nix системах? Кроме того, в настоящее время Python устанавливается практически повсеместно в системах Linux.
Джейсон Салас
@vxjasonxv материал я нашел в то время я был возиться с этим предположило , что pwdи findкоманды , которые я говорил в вопросе решимости полного пути на других , чем OS X. I системы не проверял их , хотя.
Роберт С Чаччо
1

GNU coreutils-8.15 добавил в 2012 году новый инструмент командной строки, realpathкоторый делает то, что вы хотите: он разрешает цепочки символических ссылок и выводит результат в виде абсолютного (по умолчанию) или относительного пути.

Apple , еще не включает realpathв MacOS (они , к сожалению , кажется, избегают все инструменты GPLv3), но вы можете легко установить его самостоятельно, например , с помощью Homebrew: brew install coreutils.

Маркус Кун
источник
-2

Вы можете использовать readlink -f. Он повторяется по всем ссылкам. Предположим, что ссылка - это путь, который далее является ссылкой. Вы хотели бы иметь окончательный абсолютный путь.

ДИНЕШ СЕХРА
источник
А? Что именно вы говорите?
Роб
read link -f python3Например, правильный синтаксис того, что говорит @DINESH SEHRA, заключается в том , что он буферизует полную символическую ссылку для вас.
Даниэль-Джеймс W
3
Ясно, что не опубликовано пользователем OS X, поскольку -fникогда не существовало в OS X версии readlink.
сорин