Як отримати повністю вирішений шлях символічного зв’язку в Терміналі?


47

У мене на ноутбуці заплутаний плутанина пітонних установок. Я дивився на виконувані файли, /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будуть вашими друзями для цього завдання.

" Як я можу отримати поведінку для читання GNU -f на Mac? " - це зручний ресурс.

pwd -P працює лише якщо ви знаходитесь у каталозі symlink:

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 не повторюється через випадок, коли симпосилання вказує на інші символьні посилання. Я б не назвав це "повністю вирішеним"
Джеймс Рот

Це, здається, не працює з питанням ОП щодо символічних посилань на речі, визначені такими речами ../...
користувач124384

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 до ~ / програми, щоб мати уніфікований .bash_profile / $ PATH для систем Mac і * nix.
Джейсон Салаз

1
це чудово, і це працює добре! Я би зазначив це як відповідь, за винятком того, що я також хочу знати, чи є спосіб зробити це в оболонці, як ви можете, в інших * nix системах.
Robert S Ciaccio

1
Як це зробити в інших * nix системах? Крім того, сьогодні Python встановлений майже універсально в системах Linux.
Джейсон Салаз

@vxjasonxv речі, які я знайшов у той час, коли я возився з цим, підказали, що команди pwdта findкоманди, про які я говорив у питанні, вирішують повний шлях у інших системах, ніж ОС X. Я не перевіряв їх.
Robert S Ciaccio


1

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

Apple ще не включає realpathв macOS (вони, на жаль, уникають усіх інструментів GPLv3), але ви можете легко встановити його самостійно, наприклад, використовуючи Homebrew : brew install coreutils.


-2

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


Так? Що ти точно кажеш?
Роб

Правильний синтаксис того, що говорить @DINESH SEHRA, - це, read link -f python3наприклад, використовувати , і він завантажує повне символічне посилання для вас.
Danijel-James W

3
Очевидно, що не розміщено користувачем OS X, як -fніколи не існувало у версії для перегляду посилань OS X.
sorin
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.