Comando realpath in Linux: percorsi assoluti, link e opzioni

realpath converte un percorso in forma normalizzata: gestisce i percorsi relativi, i componenti . e .., le barre ripetute e, normalmente, i collegamenti simbolici. Puoi usarlo per ottenere un percorso assoluto o un percorso relativo a una directory di riferimento; il risultato dipende dalle opzioni e dalla struttura del file system.

La normalizzazione, detta anche canonicalizzazione, elimina le ambiguità del percorso secondo le regole scelte. Le opzioni -e, -E e -m stabiliscono quali componenti devono esistere; il risultato non equivale a un’autorizzazione di accesso e non apre il file in modo sicuro.

Cos'è il comando realpath?

Con GNU realpath, il risultato predefinito è un percorso assoluto senza barre ridondanti, componenti . o .. e collegamenti simbolici da risolvere. Il comando non crea il file o le directory indicati.

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

Nell’esempio seguente la directory corrente è /home/user/project, docs e images sono directory esistenti e nessun componente è un collegamento simbolico. In queste condizioni il risultato è:

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

Se le directory intermedie non esistono, il comando può fallire; se sono presenti collegamenti, il risultato può essere diverso. Per calcolare soltanto una forma normalizzata senza accedere ai file, valuta -s -m, descritto più avanti.

Sintassi e utilizzo di base

realpath [options] file...

Nella sintassi GNU, file... indica uno o più percorsi e [options] rappresenta le opzioni facoltative: sono segnaposto, non testo da copiare. I tre comandi seguenti sono esempi indipendenti. Ogni percorso elaborato produce normalmente una riga; le directory intermedie devono esistere e permettere la ricerca.

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

Il primo comando mostra la posizione corrente; gli altri dipendono dalle directory ../logs e /var/log/nginx e dagli eventuali collegamenti. Per la sola directory corrente puoi usare pwd -P. La sintassi POSIX.1-2024 di realpath prevede un solo operando e le opzioni -e e -E: le altre funzionalità qui illustrate sono GNU.

Scegliere quali componenti devono esistere

Le seguenti modalità GNU controllano l’esistenza dei componenti. Non sono test di leggibilità del contenuto o di autorizzazione a un’operazione successiva.

Opzione Condizioni di esistenza
-E, --canonicalize Consente che manchi soltanto il componente finale della forma risolta; la parte precedente deve identificare una directory esistente. È il comportamento predefinito GNU.
-e, --canonicalize-existing Tutti i componenti del percorso, incluso l'ultimo elemento, devono effettivamente esistere.
-m, --canonicalize-missing Tratta come directory i componenti mancanti o non disponibili, anche intermedi. Non garantisce che il risultato esista o sia utilizzabile.

Richiedere un percorso esistente con -e

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

I due comandi sono esempi indipendenti e non richiedono di creare file di sistema per la prova. Riescono soltanto se il percorso indicato esiste ed è risolvibile; una barra finale richiede una directory. Se manca un componente o non puoi attraversare una directory, GNU restituisce uno stato diverso da zero. L’esito non impedisce modifiche successive al percorso.

Consentire un nome finale mancante con -E

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

Se /srv/uploads è una directory esistente e accessibile, il comando può restituire /srv/uploads/new-file.txt anche prima di creare il file. -E e --canonicalize sono stati aggiunti in GNU Coreutils 9.8: controlla realpath --version e realpath --help se l’opzione non viene riconosciuta. Le versioni GNU precedenti hanno già il comportamento predefinito che ammette l’ultimo componente mancante. Per uno script POSIX.1-2024, specifica -e o -E e verifica che l’implementazione supporti lo standard; il comportamento senza opzioni non è fissato da POSIX.

Consentire componenti mancanti con -m

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

Se non ci sono collegamenti rilevanti, l’esempio produce /srv/future/file.txt, anche se le directory non sono state create. -m ammette componenti mancanti o non disponibili, ma continua normalmente a risolvere i collegamenti che incontra. Non è una verifica dell’esistenza del risultato né della possibilità di crearlo.

Collegamenti simbolici e -L, -P, -s

Un collegamento simbolico è un nome che rimanda a un altro percorso. Quando compaiono insieme collegamenti e .., elaborare prima l’uno o l’altro può portare a directory diverse.

Opzione Comportamento
-P, --physical Risolve i collegamenti appena li incontra, prima dei successivi componenti ... È la modalità predefinita GNU.
-L, --logical Elabora prima i componenti .., poi risolve i collegamenti simbolici rimanenti. Non conserva tutti i collegamenti nel risultato.
-s, --strip, --no-symlinks Non risolve i collegamenti simbolici; normalizza ., .. e le barre ripetute. Per evitare anche l’accesso ai componenti, combina l’opzione con -m.

Risolvere i collegamenti prima di ..

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

Supponi che /srv/current punti a /opt/releases/v1 e che /opt/releases/shared e /srv/shared esistano. Con -P il risultato è /opt/releases/shared: il collegamento viene risolto prima di risalire. Sostituendo soltanto -P con -L ottieni /srv/shared, in assenza di altri collegamenti. È una configurazione illustrativa; non modificare directory di sistema per riprodurla.

Normalizzare la stringa senza seguire i collegamenti

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

Con -s -m il risultato dell’esempio è /srv/shared senza consultare i componenti nel file system. Non identifica necessariamente la destinazione reale di un collegamento e non verifica che il percorso esista. Questa combinazione è adatta al calcolo della stringa, non alla verifica del file da aprire.

Ottenere un percorso relativo

Scegliere la directory di riferimento con --relative-to

--relative-to esprime il risultato rispetto alla directory indicata. Per l’esempio, /srv/www/assets/css deve essere una directory risolvibile e priva di collegamenti che cambino il risultato. Il file finale può mancare con il comportamento predefinito GNU.

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

In queste condizioni l’output è:

assets/css/site.css

Limitare l’output relativo con --relative-base

--relative-base usa percorsi relativi per le destinazioni sotto la base risolta e percorsi assoluti per quelle esterne. Mantiene i controlli di esistenza: questa opzione non li disattiva.

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

Se /srv/www e /var/log sono directory risolvibili senza collegamenti che cambino la destinazione, i risultati sono index.html e /var/log/syslog. Se devi calcolare nomi con componenti mancanti, puoi aggiungere -m, accettando che il risultato non dimostri l’esistenza del percorso.

Differenza tra readlink -f e realpath

Confronto realpath readlink -f
Scopo principale Normalizzazione dei nomi dei file e conversione in percorsi relativi Canonicalizzazione di un percorso, oltre alla lettura diretta del collegamento offerta dal comando senza -f
Output relativo Supporto per --relative-to e --relative-base Nella versione GNU produce percorsi canonici assoluti
Uso consigliato La documentazione GNU preferisce realpath per la canonicalizzazione e per l’output relativo Senza -f legge il testo memorizzato nel collegamento; con -f esegue la canonicalizzazione
Portabilità Controlla le opzioni disponibili e le condizioni di esistenza; non tutte le opzioni GNU sono POSIX Non presumere che l’opzione -f e i suoi dettagli siano identici su tutti i sistemi Unix

La guida a readlink in inglese spiega la lettura di un collegamento. Per esaminare i metadati di un oggetto usa stat; la guida ai comandi Linux aiuta a scegliere lo strumento per altre operazioni.

Uso negli script shell

Registrare il percorso di una configurazione

#!/usr/bin/env bash
if [ "$#" -ne 1 ]; then
  printf '%s\n' 'Uso: bash percorso-config.sh PERCORSO' >&2
  exit 1
fi
config=$(realpath -e -- "$1") || {
  printf '%s\n' 'Impossibile risolvere il percorso della configurazione.' >&2
  exit 1
}
printf 'File di configurazione: %s\n' "$config"

Salva il blocco precedente in percorso-config.sh ed esegui bash percorso-config.sh ./config.yml, indicando un file o una directory esistente. Puoi usare il nome dello stesso script come argomento per una prova senza altri file. Il controllo richiede un solo argomento e termina con errore se il percorso non è risolvibile; in caso di successo stampa File di configurazione: seguito dal percorso assoluto. Non apre o modifica il file e non controlla che sia un normale file di configurazione.

Leggere più risultati separati da NUL

-z, o --zero, termina ogni risultato con il byte NUL, di valore zero, invece del carattere di nuova riga. Il seguente esempio Bash include il programma che legge i risultati: i nomi finali possono mancare, ma la directory corrente deve essere accessibile.

realpath -z -- file1 "file with space" |
while IFS= read -r -d '' percorso; do
  printf 'Percorso: <%s>\n' "$percorso"
done

Il ciclo mostra due percorsi assoluti, tra parentesi angolari, che terminano con /file1 e /file with space. Per un’elaborazione automatica mantieni NUL anche tra i programmi successivi: la stampa qui serve soltanto a osservare i dati. read -d è una funzionalità Bash. La sostituzione di comando $(...), usata nell’esempio precedente, elimina le nuove righe finali e non conserva i byte NUL: non è adatta a memorizzare tutti i possibili nomi Unix.

Limiti della verifica di un percorso

Normalizzazione e autorizzazione sono controlli diversi

Un percorso normalizzato sotto una certa directory non concede automaticamente l’accesso. Proprietà, permessi, elenchi di controllo degli accessi (ACL) e politiche di sicurezza richiedono controlli distinti. Anche -e verifica la risoluzione del percorso, non la leggibilità del contenuto.

La destinazione può cambiare dopo il controllo

Tra la chiamata a realpath e l’apertura del file, un altro processo può cambiare un collegamento o una directory. È una race condition tra controllo e uso, spesso chiamata TOCTOU (time of check to time of use, cioè tra il momento del controllo e quello dell’uso). Per dati non affidabili usa API di apertura che limitino la risoluzione rispetto a una directory autorizzata e privilegi adeguati; confrontare soltanto due stringhe non elimina il problema.

Considerare il confine della directory

La stringa /srv/www-safe inizia con /srv/www, ma non ne è una sottodirectory. Un confronto deve considerare anche il separatore e il caso di uguaglianza con la base; restano inoltre i problemi di collegamenti, modifiche concorrenti e permessi. La sola normalizzazione non crea un ambiente isolato sicuro.

Riepilogo delle principali opzioni

Opzione Descrizione
-E, --canonicalize Ammette l’ultimo componente mancante nella forma risolta; disponibile da GNU Coreutils 9.8.
-e, --canonicalize-existing Richiede che tutti i componenti esistano e siano risolvibili; una barra finale richiede una directory.
-m, --canonicalize-missing Tratta come directory i componenti mancanti o non disponibili.
-L, --logical Interpreta i collegamenti simbolici dopo aver elaborato logicamente ...
-P, --physical Risolve i collegamenti prima dei successivi ..; è la modalità predefinita GNU.
-s, --no-symlinks Pulisce la stringa del percorso senza risolvere i collegamenti simbolici.
--relative-to=directory Stampa percorsi relativi basati sulla directory specificata.
--relative-base=directory Usa l’output relativo per le destinazioni sotto la base risolta e quello assoluto per le altre.
-q, --quiet Sopprime i messaggi diagnostici sul percorso specificato.
-z, --zero Separa i risultati con caratteri NUL.

Domande frequenti

realpath funziona anche con file inesistenti?

Il comportamento predefinito GNU ammette che manchi il componente finale, ma richiede le directory precedenti. GNU Coreutils 9.8 e successivi permettono di indicarlo con -E. Usa -m per ammettere componenti intermedi mancanti e -e per richiedere l’esistenza dell’intero percorso.

realpath risolve sempre i collegamenti simbolici?

In modalità fisica predefinita, risolve i collegamenti simbolici. Per normalizzare la stringa del percorso senza seguire i collegamenti, usa -s o --no-symlinks.

Che differenza c’è tra pwd -P e realpath .?

Entrambi possono mostrare il percorso assoluto fisico della posizione corrente. pwd -P è specializzato per la directory di lavoro corrente, mentre realpath fornisce opzioni per percorsi arbitrari multipli, condizioni di esistenza e output del percorso relativo.

Il risultato di realpath basta a impedire l’attraversamento di directory?

No. Un percorso può cambiare tra il controllo e l’uso, e le autorizzazioni restano separate. Per l’input non affidabile servono modalità di apertura adatte al sistema operativo, limiti alla risoluzione e privilegi adeguati; una semplice verifica del prefisso non basta.

Documentazione di riferimento