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
.
readlink
no caminho conhecido e compará-lo com o caminho que está testando?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.Respostas:
Se você deseja verificar se
$path
é um link simbólico cujo destino é/some/where
, você pode usar oreadlink
utilitário. Não é POSIX, mas está disponível em muitos sistemas (GNU / Linux, BusyBox, * BSD, ...).Observe que esta é uma comparação exata do texto. Se o destino do link for
/some//where
, ou se forwhere
e o valor$path
for for/some/link
, os textos não corresponderão.Muitas versões
readlink
suportam a opção-f
, que canoniza o caminho expandindo todos os links simbólicos.Muitos shells, incluindo dash, ksh, bash e zsh, suportam o
-ef
operadortest
interno 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.fonte
Para evitar problemas com um caminho relativo e absoluto e "/" no final de um caminho ou link:
fonte
readlink
parece não ser necessário,realpath
resolverá automaticamente o link simbólico.