Como obter o caminho totalmente resolvido de um link simbólico no Terminal?

47

Tenho uma confusão de instalações python no meu laptop. Eu estava olhando para os executáveis /usr/local/bine todos eles são links simbólicos para../../../Library......

Há algum comportamento estranho em torno disso. Se eu fizer ls -lhaGeu vejo --->e o caminho relativo para o direito dos links simbólicos:

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

No entanto, não consigo obter nenhuma das ferramentas de linha de comando para resolver esse caminho e exibir o caminho real para python3. Eu encontrei alguns petiscos aqui e ali sobre o uso pwd -Pe o findutilitário para fazer isso. O problema é que eles não parecem funcionar no OS X da maneira que as pessoas os descrevem trabalhando no Linux (ou seja, produzindo o caminho completo para o link simbólico). Eles apenas imprimem o caminho dos links simbólicos para mim:

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

Alguma idéia do que está acontecendo aqui?

Robert S Ciaccio
fonte

Respostas:

36

Eu acho que pwd -Pe readlinkseremos seus amigos para esta tarefa.

" Como posso obter o comportamento do readlink -f do GNU em um Mac? " É um recurso útil.

pwd -P só funciona se você estiver dentro do diretório do link simbólico:

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

readlink funciona especificando o destino (portanto, ele pode ser usado em arquivos):

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

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

A saída de readlinkparece ser relativa ao pai do destino especificado.

Ex: o pai de /varé /, portanto, private/varestá correto, em relação a /. Pelo meu exemplo acima bin -> Applications, ambos estão no meu diretório pessoal, não importa onde eu o execute, a saída é a mesma.

Jason Salaz
fonte
3
O readlink não se repete no caso em que o link simbólico aponta para outros links simbólicos. Eu não chamaria isso de "totalmente resolvido"
James Roth
Isso não parece funcionar com a pergunta do OP sobre links simbólicos para coisas especificadas com coisas como ../...
user124384
18

Isso resolve recursivamente e retorna um caminho absoluto:

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

Ou a versão não interativa:

python -c "import os; print(os.path.realpath('/usr/local/bin/python3'))"
James Roth
fonte
1
Quando os componentes internos falharem, recorra ao script ... Legal. Definitivamente funciona: $ python -c "import os; print os.path.realpath('bin')">> /Users/jason/Applications. Eu vinculo ~ / bin a ~ / Applications para ter um .bash_profile / $ PATH unificado nos sistemas Mac e * nix.
precisa
1
isso é ótimo e funciona bem! Eu marcaria isso como a resposta, exceto que também quero saber se existe uma maneira de fazer isso no shell, como você pode em outros sistemas * nix.
Robert S Ciaccio
1
Como você faz isso em outros sistemas * nix? Além disso, o Python é instalado quase universalmente nos sistemas Linux atualmente.
precisa
@vxjasonxv O material que encontrei na época em que estava mexendo com isso sugeria que os comandos pwde findsobre os quais falei na questão resolvem o caminho completo em sistemas diferentes do OS X. Ainda não os testei.
Robert S Ciaccio
1

O GNU coreutils-8.15 adicionou em 2012 uma nova ferramenta de linha de comando realpathque faz o que você deseja: resolve cadeias de links simbólicos e gera o resultado como um caminho absoluto (padrão) ou relativo.

A Apple ainda não inclui realpathno MacOS (que infelizmente parece shun todas as ferramentas GPLv3), mas você pode facilmente instalá-lo sozinho, por exemplo, usando Homebrew: brew install coreutils.

Markus Kuhn
fonte
-2

Você pode usar readlink -f. Ele se repete através de todos os links. Suponha que o link seja para um caminho que é mais um link. Você gostaria de ter o caminho absoluto final.

DINESH SEHRA
fonte
Hã? O que você está dizendo exatamente?
Rob
A sintaxe correta para o que o @DINESH SEHRA está dizendo é usar, read link -f python3por exemplo, e armazenará em buffer o link simbólico completo para você.
Danijel-James W
3
Claramente não postado por um usuário do OS X como -fnunca existiu na versão do OSlink do readlink.
sorin 27/05