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.




