Linux / Comando realpath: normalizar caminhos, links e saídas relativas

realpath normaliza um caminho e, no modo físico padrão do GNU, resolve links simbólicos para produzir uma localização absoluta. Ele processa caminhos relativos, ., .. e barras redundantes. Use -e para exigir que o destino exista, -m para permitir componentes ausentes e as opções de saída relativa quando precisar de um caminho em relação a outra pasta.

Os exemplos usam GNU Coreutils em Bash; confirme a implementação com realpath --version e as opções com realpath --help. A opção -E, com a forma longa --canonicalize, foi adicionada no GNU Coreutils 9.8, conforme o registro oficial de alterações do Coreutils. Versões anteriores podem oferecer o mesmo comportamento padrão sem aceitar a opção explícita. Resolver um caminho não equivale a abrir o arquivo nem a autorizar acesso a ele.

O que é o comando realpath?

realpath gera o nome de arquivo ou caminho de diretório normalizado. O resultado típico é um caminho absoluto, e componentes desnecessários /, ., .. e links simbólicos são tratados.

realpath ./docs/../images/logo.webp

Se a pasta atual for /home/user/project, docs e images existirem e não houver links que mudem a resolução, uma saída ilustrativa é:

/home/user/project/images/logo.webp

O resultado depende da pasta de trabalho e dos componentes realmente encontrados. No GNU, por padrão, todos os componentes anteriores ao último precisam ser diretórios existentes e acessíveis. O último nome pode ainda não existir. Se faltar uma pasta intermediária, a consulta pode falhar em vez de imprimir o caminho ilustrado.

Sintaxe e uso básico

realpath [opções] arquivo ...

A sinopse usa colchetes para partes opcionais e reticências para repetição; não os copie literalmente. GNU realpath aceita vários argumentos e escreve um resultado por linha. Nas três consultas independentes abaixo, ../logs e os diretórios de /var/log/nginx precisam existir para o comportamento padrão. Adapte os caminhos a pastas de teste acessíveis.

realpath .
realpath ../logs/app.log
realpath /var//log/./nginx/../syslog

Para consultar somente a posição física atual, o comando pwd -P é direto. realpath também aceita outros caminhos. O formato POSIX (Portable Operating System Interface) padronizado é realpath [-E|-e] arquivo, com um único arquivo e existência padrão não especificada; consulte a especificação POSIX de realpath ao precisar de portabilidade.

Escolher a condição de existência

Escolha a condição de existência conforme a próxima operação. Nas implementações que aceitam -E, indicar -e ou -E deixa a intenção explícita em vez de depender de um padrão que pode variar entre sistemas.

Opção Condições de existência
-E, --canonicalize Permite que só o último componente esteja ausente, com o prefixo resolvido como diretório existente. Opção explícita no GNU desde 9.8; esse comportamento já era o padrão GNU.
-e, --canonicalize-existing Todos os componentes do caminho, incluindo o último item, devem realmente existir.
-m, --canonicalize-missing Permite componentes ausentes ou indisponíveis, tratando-os como diretórios; ainda pode resolver links que existem.

Exigir um caminho existente com -e

realpath -e /etc/passwd
realpath --canonicalize-existing /srv/app/config.yml

Cada linha é uma consulta independente e exige o caminho correspondente existente. Um erro de resolução produz retorno diferente de zero; não use a saída como válida sem verificar esse retorno. -e também pode aceitar diretórios: ele não certifica o formato de um arquivo de configuração nem mantém o objeto imutável após a consulta.

Permitir o último nome ausente com -E

realpath -E /srv/uploads/new-file.txt

Neste exemplo, /srv/uploads precisa ser um diretório existente; apenas new-file.txt pode estar ausente. O comando exige uma implementação que ofereça -E, como GNU Coreutils 9.8 ou posterior. Se a opção não aparecer na ajuda da versão instalada, não suponha que ela será aceita; consulte a documentação dessa versão. Um resultado calculado não garante permissão para criar o arquivo.

Permitir componentes ausentes com -m

realpath -m /srv/not-created/../future/file.txt

Com -m, o resultado pode ser /srv/future/file.txt mesmo que essas pastas não existam. Isso não cria diretórios nem garante que seja possível gravar ali. -m sozinho ainda resolve links simbólicos existentes; para um cálculo puramente textual que não siga links, combine-o com -s.

Links simbólicos e -L, -P, -s

Um link simbólico aponta para outro caminho. Com .., resolver primeiro o link ou retirar primeiro um componente do texto pode produzir locais diferentes. Em realpath, tanto -L como -P resolvem links: -L não preserva seus nomes como pode ocorrer com pwd -L.

Opção Ação
-P, --physical Ao encontrar um link simbólico, ele é interpretado, e então os .. subsequentes são processados. Este é o modo padrão no GNU.
-L, --logical Processa logicamente os .. antes de resolver os links simbólicos.
-s, --strip, --no-symlinks Limpar apenas os componentes de ponto e barras duplicadas sem seguir links simbólicos.

Consultar a resolução física

realpath -P /srv/current/../shared

Considere uma estrutura já preparada: /srv/current aponta para /srv/releases/2026-09, e existem /srv/releases/shared e /srv/shared, sem outros links. A consulta física acima resolve o destino antes de .. e resulta em /srv/releases/shared. Com realpath -L /srv/current/../shared, a redução lógica do texto resulta em /srv/shared. Não altere links de uma implantação real apenas para experimentar.

Normalizar texto sem seguir links

realpath -s -m /srv/current/../shared

A combinação -s -m calcula /srv/shared pelo texto, sem seguir o link current nem exigir que as pastas existam. Esse resultado não descreve necessariamente a localização física que o kernel usaria para abrir o caminho original. -s sem -m ainda obedece à condição de existência selecionada.

Produzir caminhos relativos

Definir a base com --relative-to

--relative-to muda a apresentação para um caminho relativo à pasta indicada. Para o resultado abaixo, suponha que /srv/www/assets/css exista e não haja links que levem a outra árvore. Um destino fora da base também pode produzir componentes ..; esta opção não limita o acesso à base.

realpath --relative-to=/srv/www /srv/www/assets/css/site.css

A saída é a seguinte.

assets/css/site.css

Relativizar seletivamente com --relative-base

--relative-base produz um nome relativo quando o resultado está na própria pasta-base ou em seus descendentes; fora dela, mantém o nome absoluto. Considere as pastas intermediárias existentes e sem links que alterem estes destinos:

realpath --relative-base=/srv/www /srv/www/index.html /var/log/syslog

As saídas esperadas são index.html e /var/log/syslog, nessa ordem. Para o próprio diretório-base, a forma relativa é .. As opções de existência, como -e ou -m, também se aplicam a essas consultas.

Diferenças entre readlink -f e realpath

Itens de comparação realpath readlink -f
Objetivo principal Normalização de nomes de arquivo e conversão para caminhos relativos Normalização de nomes com a opção -f; sem -f, readlink consulta o texto armazenado no link.
Saída relativa Suporte a --relative-to e --relative-base Geralmente exibe caminhos canônicos absolutos
Uso recomendado Para a canonicalização de caminhos, a documentação do GNU recomenda realpath Com -f, normaliza o caminho; para ler o texto literal do link, use readlink sem essa opção.
Portabilidade Você precisa verificar as diferenças entre as opções e as condições de existência padrão Não se pode assumir que -f seja o mesmo em todas as implementações Unix

Usar em scripts Bash

Consultar o caminho de um arquivo de configuração

Salve o script completo como show-config-path.sh e execute bash show-config-path.sh "./config.yml", usando um arquivo regular de teste que já exista. Ele requer Bash e GNU realpath com -e. A quantidade incorreta de argumentos retorna 2; falha de resolução ou objeto que não seja arquivo regular retorna 1.

#!/usr/bin/env bash
if [ "$#" -ne 1 ]; then
  printf '%s\n' 'Uso: bash show-config-path.sh ARQUIVO' >&2
  exit 2
fi
config=$(realpath -e -- "$1") || {
  printf '%s\n' 'Não foi possível resolver o caminho do arquivo.' >&2
  exit 1
}
if [ ! -f "$config" ]; then
  printf '%s\n' 'O caminho não representa um arquivo regular.' >&2
  exit 1
fi
printf 'Arquivo de configuração: %s\n' "$config"

A mensagem mostra o caminho absoluto do arquivo de teste. O script não lê nem valida o conteúdo ou o formato do arquivo, não testa todas as permissões de uso e não abre o arquivo de forma protegida contra mudanças simultâneas. A substituição de comando também remove quebras de linha finais; para preservar nomes Unix incomuns, use uma saída delimitada por NUL com um consumidor apropriado.

Separar vários resultados com NUL

A extensão GNU -z, ou --zero, termina cada resultado com um byte nulo, NUL. Substitua os dois nomes abaixo por caminhos de teste cujos diretórios anteriores ao último componente sejam acessíveis. O nome com espaços é um único argumento graças às aspas:

realpath -z -- file1 "file with space"

O programa consumidor precisa aceitar registros NUL, inclusive quando os nomes contêm quebras de linha. Não use $(...) para guardar esse fluxo em uma variável Bash, pois ela não preserva bytes NUL. Um retorno diferente de zero continua indicando falha mesmo quando houver alguma saída referente aos outros argumentos.

Limites da normalização na validação de caminhos

Distinguir normalização e autorização

Um caminho normalizado não concede autorização de leitura ou gravação. Proprietário, permissões, listas de controle de acesso (ACLs) e políticas de segurança continuam relevantes. O comando stat ajuda a consultar metadados, mas também não transforma uma consulta em uma abertura segura do arquivo.

Evitar a separação entre conferir e abrir

Existe uma condição de corrida se links ou pastas puderem mudar entre a consulta e a abertura do arquivo. Em programas Linux que precisam restringir caminhos de terceiros, a documentação de openat2 descreve restrições de resolução, como RESOLVE_BENEATH, aplicadas durante a abertura em relação a um descritor de diretório. A escolha exige considerar o kernel e as regras da aplicação; não é uma garantia obtida com uma comparação posterior de strings no shell.

Considerar limites de componentes, não apenas prefixos

/srv/www-safe também começa com /srv/www na string. Ao verificar a inclusão de um caminho base, considere os limites do diretório, pois a normalização de caminho sozinha não cria um ambiente protegido.

Opções principais

Opção Descrição
-E, --canonicalize Permite o último componente ausente com prefixo existente; opção GNU desde 9.8.
-e, --canonicalize-existing Todos os componentes devem realmente existir para sucesso.
-m, --canonicalize-missing Trata componentes inexistentes como diretórios.
-L, --logical Processa .. no caminho antes de resolver links simbólicos.
-P, --physical É um modo físico que resolve links simbólicos primeiro e é o padrão para GNU.
-s, --no-symlinks Não segue links; a condição de existência depende de -e, -E ou -m.
--relative-to=diretório Imprime caminhos relativos com base no diretório especificado.
--relative-base=diretório Imprime apenas caminhos sob a base como caminhos relativos.
-q, --quiet Suprime mensagens de diagnóstico sobre o caminho especificado.
-z, --zero Separa resultados com caracteres NUL.

A referência de comandos Linux por tarefa reúne outras ferramentas para consultar caminhos e arquivos.

Perguntas frequentes

É possível usar realpath em arquivos que não existem?

No padrão GNU, o último componente pode estar ausente se o prefixo resolver para um diretório existente. GNU Coreutils 9.8 ou posterior também permite pedir isso explicitamente com -E. Para permitir componentes intermediários ausentes, use -m; para exigir a existência de todos, use -e.

O realpath sempre resolve links simbólicos?

O padrão físico GNU segue links. -L também os resolve, mudando a ordem em relação a ... Para não seguir links, use -s; combine com -m quando quiser apenas normalização textual sem exigir a existência dos componentes.

Qual é a diferença entre pwd -P e realpath .?

Ambos podem mostrar o caminho absoluto físico da localização atual. pwd -P é especializado para o diretório de trabalho atual, enquanto realpath fornece opções para múltiplos caminhos arbitrários, condições de existência e saída de caminho relativo.

Checar apenas o resultado do realpath pode prevenir ataques de travessia de diretório?

Não. O caminho pode mudar entre a verificação e o uso do arquivo, e questões de permissão são separadas. Em limites de confiança, você deve usar interfaces de abertura de arquivos com as restrições apropriadas junto com separação de permissões e verificações do limite do diretório.

Documentação oficial