Linux / Comando readlink: consultar destinos de links simbólicos
readlink mostra o caminho de destino armazenado em um link simbólico, sem ler o conteúdo do arquivo apontado. Ele permite conferir destinos relativos ou absolutos e consultar um link cujo destino não existe. No GNU, -f, -e e -m mudam para um modo de normalização do caminho, com condições de existência diferentes.
Os exemplos usam GNU Coreutils e Bash; confira readlink --version e readlink --help no sistema utilizado. Para normalizar caminhos e gerar saídas relativas, o GNU recomenda realpath. Uma consulta readlink current pressupõe que current seja um link acessível; prepare a área de exercício antes dos exemplos que criam links.
O que é o comando readlink?
Quando você especifica um link simbólico como argumento, ele exibe a string de destino armazenada no link.
readlink current
Se o link current apontar para releases/2026-09, ele será exibido da seguinte forma.
releases/2026-09
Um link relativo é interpretado a partir da pasta que contém o próprio link. A consulta básica retorna o texto armazenado, sem convertê-lo em caminho absoluto nem exigir que o destino exista. Os exemplos seguintes criam uma área temporária para observar essa diferença sem alterar uma implantação real.
Sintaxe e preparação do exercício
readlink [opções] arquivo ...
Execute o bloco completo no mesmo terminal Bash em que fará as consultas seguintes. Ele requer mktemp, mkdir, ln e readlink. A variável readlink_demo guarda uma pasta exclusiva; os comandos ligados por && só continuam se a etapa anterior tiver sucesso. O bloco não muda a pasta de trabalho do terminal e não substitui arquivos existentes.
readlink_demo=$(mktemp -d "${TMPDIR:-/tmp}/readlink-demo.XXXXXX") &&
mkdir -p -- "$readlink_demo/releases/2026-09" "$readlink_demo/shared" "$readlink_demo/app" &&
printf '%s\n' 'config-demo' > "$readlink_demo/releases/2026-09/config.yml" &&
printf '%s\n' 'config-compartilhada' > "$readlink_demo/shared/config.yml" &&
ln -s releases/2026-09 "$readlink_demo/current" &&
ln -s releases/2026-09 "$readlink_demo/previous" &&
ln -s shared/config.yml "$readlink_demo/config-link" &&
readlink -- "$readlink_demo/current"
A saída esperada da preparação é releases/2026-09. Continue apenas se o bloco terminar com sucesso; a pasta permanece para inspeção e será usada pelos próximos exemplos. Para comparar, o arquivo regular criado na área de teste não possui um destino de link: a consulta abaixo falha, e o printf mostra seu código de retorno, normalmente 1 no GNU.
readlink -- "$readlink_demo/shared/config.yml"
printf '%s\n' "$?"
Links relativos e absolutos
Ler um destino relativo
O destino relativo tem como base a pasta que contém o link, e não a posição atual do terminal. Na área preparada, o exemplo cria um link em app que usa ../shared/config.yml:
ln -s ../shared/config.yml "$readlink_demo/app/config.yml" &&
readlink -- "$readlink_demo/app/config.yml"
A saída é ../shared/config.yml. Partindo de $readlink_demo/app, ela aponta para o arquivo $readlink_demo/shared/config.yml. A distinção entre o link e seu destino também é descrita na documentação de links simbólicos do Linux.
Ler um destino absoluto
ln -s "$readlink_demo/releases/2026-09" "$readlink_demo/absolute-current" &&
readlink -- "$readlink_demo/absolute-current"
O resultado é o caminho absoluto da pasta de lançamento dentro da área temporária. O prefixo gerado por mktemp varia; esta é uma saída ilustrativa:
/tmp/readlink-demo.A1b2C3/releases/2026-09
Se você mover toda a área temporária, o destino absoluto continuará apontando para a localização antiga. Um link relativo pode acompanhar uma árvore movida quando a relação entre as pastas for preservada. Mover somente o link para outra pasta, por sua vez, pode mudar o significado de seu destino relativo.
Consultar um link com destino ausente
Mesmo que o arquivo de destino não exista, o modo básico de readlink pode ler a string de destino armazenada, desde que o link simbólico em si permaneça.
ln -s missing-target "$readlink_demo/broken-link" &&
readlink -- "$readlink_demo/broken-link"
missing-target
Na área de exercício, missing-target não existe. O teste abaixo distingue o link do resultado da tentativa de seguir seu destino:
if [ -L "$readlink_demo/broken-link" ] && [ ! -e "$readlink_demo/broken-link" ]; then
printf '%s\n' 'O link existe, mas o destino não foi confirmado.'
fi
No teste de arquivos do Bash, -L identifica o link e -e segue seu destino. A condição não prova, em qualquer ambiente, que o destino foi apagado: falta de acesso ou um ciclo de links também podem impedir a confirmação. O exemplo tem um destino deliberadamente ausente.
Opções de normalização de caminhos
Sem essas opções, o argumento deve ser um link. Com -f, -e ou -m, GNU readlink passa a normalizar nomes e pode aceitar caminhos de arquivos regulares. As condições são diferentes:
| Opção | Ação |
|---|---|
-f, --canonicalize |
Todos os componentes do caminho, exceto o último, devem existir, e links simbólicos e componentes ponto são resolvidos. |
-e, --canonicalize-existing |
Todos os componentes, incluindo o último item, devem existir. |
-m, --canonicalize-missing |
Componentes inexistentes também são assumidos como diretórios para normalizar o caminho. |
Normalizar com -f
readlink -f -- "$readlink_demo/current/config.yml"
Na estrutura preparada, a saída termina em /releases/2026-09/config.yml. -f resolve links e componentes . e ..; só o último componente pode estar ausente. O prefixo precisa resolver para diretórios existentes e acessíveis. Consulte as condições de normalização no manual GNU de readlink; não use a ausência de erro com -f para concluir que o resultado é um diretório.
Exigir todos os componentes com -e
readlink -e -- "$readlink_demo/current/config.yml"
Neste exercício, -e mostra o mesmo caminho porque o arquivo existe. Se qualquer componente estiver ausente ou indisponível, a consulta falha. Uma barra final exige que o resultado seja diretório. Essa verificação não mantém o objeto inalterado entre a consulta e uma abertura posterior do arquivo.
Permitir componentes ausentes com -m
readlink -m -- "$readlink_demo/future/../uploads/new-file.txt"
O resultado termina em /uploads/new-file.txt, mesmo sem essas pastas na área de teste. -m não cria o destino nem garante permissão para criá-lo. Ele ainda pode seguir links que existam: para normalização puramente textual sem seguir links, avalie a combinação realpath -s -m em vez de presumir que -m signifique apenas tratamento de texto.
Consultar vários links e separar a saída
Relacionar nomes e destinos
O GNU readlink pode manipular múltiplos links de uma vez.
readlink -- "$readlink_demo/current" "$readlink_demo/previous" "$readlink_demo/config-link"
Com os três links preparados, as saídas são releases/2026-09, releases/2026-09 e shared/config.yml. Um argumento inválido pode não gerar uma linha de saída, portanto não associe nomes e resultados apenas pela posição em uma lista. O laço abaixo mostra cada nome, informa falhas e retorna sucesso somente se todas as consultas funcionarem:
readlink_failed=0
for link in "$readlink_demo/current" "$readlink_demo/previous" "$readlink_demo/config-link"; do
if target=$(readlink -- "$link"); then
printf '%s -> %s\n' "$link" "$target"
else
printf 'Não foi possível ler: %s\n' "$link" >&2
readlink_failed=1
fi
done
[ "$readlink_failed" -eq 0 ]
Distinguir -n e -z
GNU -n, ou --no-newline, omite o terminador ao consultar um único link. Use-o com uma entrada por vez: com vários argumentos, o GNU emite um aviso e não oferece essa mesma apresentação sem separadores.
readlink -n -- "$readlink_demo/current"
-z, ou --zero, termina cada resultado com um byte nulo, NUL, inclusive o último. É apropriado para um consumidor que aceite registros NUL quando os destinos contêm quebras de linha. Não armazene esse fluxo em uma variável Bash com $(...), pois ela não preserva bytes NUL. O laço anterior serve para exibição: a substituição de comando também remove quebras de linha finais do destino.
readlink -z -- "$readlink_demo/current" "$readlink_demo/previous"
Comparar readlink, realpath, ls e stat
| Comando | Objetivo principal | Recursos |
|---|---|---|
readlink |
Consultar o texto de destino armazenado no link | Pode ler o texto mesmo quando o destino não existe |
realpath |
Normalização de nomes de arquivos e cálculo de caminhos relativos | Recomendado pela documentação GNU para normalizar caminhos |
ls -l |
Exibir links e destinos em uma listagem para leitura humana | Mistura destino e metadados; evite analisar sua apresentação em scripts |
stat |
Consultar metadados do link ou do destino | Você pode verificar inode, permissões, datas e tipo de arquivo |
Para consultar somente o texto do destino, use readlink. O guia de stat trata dos metadados e o guia de ls explica as listagens. Para normalizar caminhos ou gerar saídas relativas, realpath oferece opções específicas.
Usar em scripts Bash
Classificar o destino relativo ou absoluto
Salve este script completo como classify-link.sh e execute bash classify-link.sh "$readlink_demo/current", depois de preparar a área no mesmo terminal. Ele requer Bash e readlink. A quantidade incorreta de argumentos retorna 2 e uma falha de leitura retorna 1; um link legível é classificado sem abrir seu destino.
#!/usr/bin/env bash
if [ "$#" -ne 1 ]; then
printf '%s\n' 'Uso: bash classify-link.sh LINK' >&2
exit 2
fi
link=$1
target=$(readlink -- "$link") || {
printf '%s\n' 'Não foi possível ler o link simbólico.' >&2
exit 1
}
case "$target" in
/*) printf '%s\n' 'Destino absoluto.' ;;
*) printf '%s\n' 'Destino relativo.' ;;
esac
Com current, o resultado esperado é Destino relativo.; com absolute-current, o script mostra Destino absoluto. Essa classificação olha somente o início do destino. Ela não confirma existência, permissões ou segurança. Para resolver um destino relativo, use a pasta que contém o link, como fazem as consultas -f e -e, em vez de concatená-lo à pasta atual do terminal.
Tratar o status de saída
Verifique o retorno da consulta, não apenas se uma variável ficou vazia. Além de erros, a substituição de comando pode alterar a representação de um destino que termine em quebras de linha. Este trecho usa current da área preparada, informa a falha e termina com status 1 se não puder ler o link:
link="$readlink_demo/current"
if target=$(readlink -- "$link"); then
printf '%s\n' "$target"
else
printf 'Não foi possível ler o link: %s\n' "$link" >&2
false
fi
Opções principais
| Opção | Descrição |
|---|---|
-f, --canonicalize |
Normalize o caminho cujos componentes existem, exceto o último item. |
-e, --canonicalize-existing |
Todos os componentes do caminho devem existir para que haja sucesso. |
-m, --canonicalize-missing |
Trate componentes inexistentes como diretórios. |
-n, --no-newline |
Omitir o delimitador de saída após um único resultado. |
-z, --zero |
Termine cada resultado com um caractere NUL. |
-q, -s, --quiet |
Suprime a maioria das mensagens de erro. |
-v, --verbose |
Exibe mensagens de erro. |
A referência de comandos Linux por tarefa reúne outras ferramentas para consultar arquivos e caminhos.
Problemas comuns
Falha sem saída visível
Sem opções de normalização, o argumento pode não ser um link ou pode estar inacessível. Use -v para pedir diagnósticos. Segundo o manual GNU atual, a maioria dos diagnósticos é suprimida por padrão e POSIXLY_CORRECT muda o padrão para verboso. Como esse comportamento pode variar em versões antigas ou outras implementações, confira a versão instalada e prefira -v explicitamente quando precisar do diagnóstico. -q e -s pedem silêncio explicitamente. Note que readlink -s não tem o significado de realpath -s.
Destino relativo aparentemente incorreto
O caminho relativo de saída deve ser interpretado com base no diretório que contém o link. Não é baseado no diretório atual a partir do qual o comando é executado.
Diferenças de readlink -f entre sistemas
Opções de normalização, incluindo -f, possuem diferenças de implementação. Em scripts que requerem portabilidade, verifique se o sistema operacional alvo as suporta, e se seu objetivo é a normalização de caminhos, também compare as implementações e opções realpath disponíveis.
Perguntas frequentes
O readlink lê o conteúdo do arquivo para o qual um link simbólico aponta?
Não. No modo padrão, ele fornece a string do caminho de destino armazenada no arquivo de link. Ele não lê o conteúdo do arquivo de destino.
Links simbólicos quebrados também podem ser verificados com readlink?
Se o próprio link existir e puder ser lido, você pode verificar a string do destino armazenada com o readlink padrão. A normalização -e só tem sucesso se o alvo real existir.
Caminhos relativos são fornecidos. Como posso verificar o caminho absoluto?
Em um ambiente GNU, você pode usar readlink -f link, mas para normalização geral de caminhos, usar realpath é mais claro em termos de funcionalidade e intenção.
Por que usar readlink em vez de ls -l?
ls -l é adequado para listagens legíveis por humanos, enquanto readlink apenas gera a string de destino, tornando-o conveniente para scripts. Em automação, certifique-se de também lidar com o status de saída e a separação de nomes de arquivos.




