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.

Documentação oficial