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?

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.


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'))"

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.


-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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.