Como verificar o destino de um link simbólico aponta para um caminho específico

16

Dentro de um script bash, eu sei que posso verificar se um arquivo é um link simbólico com a seguinte sintaxe

if [ -L $path ]

Alguém sabe como eu testaria se esse caminho estivesse vinculado a um caminho específico? Por exemplo, eu quero verificar se o alvo de $pathé /some/where.

BillMan
fonte
2
Você quer dizer ligado a por um caminho particular? Você não poderia fazer um readlinkno caminho conhecido e compará-lo com o caminho que está testando?
Bratchley 24/03
@Bratchley. Sim, foi isso que eu quis dizer ... obrigado pela resposta.
BillMan
2
Peço fortemente que você sempre coloque variáveis ​​de shell entre aspas (por exemplo, if [ -L "$path" ]) , a menos que tenha um bom motivo para não fazê-lo e tenha certeza de que sabe o que está fazendo.
G-Man diz 'Reinstate Monica'
@ G-Man, obrigado pelo ótimo feedback .. subconscientemente, sei fazer isso, mas esqueça na prática .. o reforço ajuda.
BillMan

Respostas:

22

Se você deseja verificar se $pathé um link simbólico cujo destino é /some/where, você pode usar o readlinkutilitário. Não é POSIX, mas está disponível em muitos sistemas (GNU / Linux, BusyBox, * BSD, ...).

if [ "$(readlink -- "$path")" = /some/where ]; then 

Observe que esta é uma comparação exata do texto. Se o destino do link for /some//where, ou se for wheree o valor $pathfor for /some/link, os textos não corresponderão.

Muitas versões readlinksuportam a opção -f, que canoniza o caminho expandindo todos os links simbólicos.

Muitos shells, incluindo dash, ksh, bash e zsh, suportam o -efoperador testinterno para testar se dois arquivos são iguais (links físicos para o mesmo arquivo, depois de seguir os links simbólicos). Esse recurso também é amplamente suportado, mas não o POSIX.

if [ "$path" -ef "/some/where" ]; then 
Gilles 'SO- parar de ser mau'
fonte
o primeiro exemplo não funciona quando o link aponta para um caminho relativo ...
inemanja 04/11/19
@inemanja Claro que sim. Mas, como afirmo, esta é uma comparação de texto . Ele trata caminhos diferentes para o mesmo alvo que diferentes. Se você quiser testar se o destino de um link simbólico é um arquivo específico , e não um caminho específico , use um dos métodos descritos abaixo.
Gilles 'SO- stop be evil'
0

Para evitar problemas com um caminho relativo e absoluto e "/" no final de um caminho ou link:

if [ "$(realpath $(readlink -- "$path"))" = $(realpath /some/where) ]; then
    echo "Is"
else 
    echo "Is not"
fi
inemanja
fonte
readlinkparece não ser necessário, realpathresolverá automaticamente o link simbólico.
Dagang