Comando readlink in Linux: destinazioni dei link e percorsi canonici
readlink mostra il percorso di destinazione memorizzato in un collegamento simbolico, cioè un nome che rimanda a un altro percorso. Puoi usarlo per leggere un collegamento relativo o capire dove punta un collegamento interrotto, senza leggere il contenuto del file di destinazione.
GNU readlink offre anche la normalizzazione dei percorsi con -f, -e e -m. Per la normalizzazione generale e l’output relativo, la documentazione GNU preferisce realpath. Qui distinguiamo la lettura del testo di un collegamento dalla risoluzione della sua destinazione.
Cos'è il comando readlink?
Passando il nome di un collegamento simbolico, il comando ne legge la stringa di destinazione. Nell’esempio si suppone che current sia già un collegamento:
readlink current
Se il collegamento current punta a releases/2026-09, l'output sarà il seguente.
releases/2026-09
Il valore relativo viene interpretato dalla directory che contiene il collegamento. La modalità predefinita non lo trasforma in un percorso assoluto e non dimostra che la destinazione esista.
Sintassi di base e utilizzo
readlink [options] file...
La sintassi GNU accetta uno o più percorsi; [options] e file... sono segnaposto. Per una prova Linux riproducibile, esegui il blocco seguente in Bash da una directory scrivibile. Crea una nuova cartella readlink-demo, vi entra e prepara tre collegamenti. Si arresta se la cartella esiste già, senza riutilizzarne il contenuto. Non servono privilegi amministrativi.
mkdir readlink-demo || exit 1
cd readlink-demo || exit 1
mkdir -p releases/2026-09 || exit 1
ln -s releases/2026-09 current || exit 1
ln -s releases/2026-08 previous || exit 1
ln -s shared/config.yml config-link || exit 1
readlink current
Il blocco stampa releases/2026-09. I nomi current, previous e config-link degli esempi successivi si riferiscono a questa cartella di prova; i rispettivi testi sono releases/2026-09, releases/2026-08 e shared/config.yml. Gli ultimi due possono non esistere come destinazioni: la lettura del collegamento riesce comunque. Per terminare, torna alla directory iniziale con cd .. e rimuovi soltanto readlink-demo con il gestore di file dopo averne verificato il contenuto. Un file normale non ha una destinazione da leggere: nell’esempio seguente, se /etc/passwd è un file normale, il comando non stampa nulla e il successivo printf mostra 1 con GNU. Quel numero è lo stato di readlink, non quello finale di printf.
readlink /etc/passwd
printf '%s\n' "$?"
Comprendere i collegamenti relativi e assoluti
Leggere un collegamento relativo
La destinazione relativa viene interpretata dalla directory che contiene il collegamento, non dalla directory corrente del terminale. Il seguente esempio con /srv è illustrativo: richiede una directory /srv/app scrivibile e un nome config.yml libero; non eseguirlo su una configurazione esistente.
ln -s ../shared/config.yml /srv/app/config.yml
readlink /srv/app/config.yml
Il testo stampato è ../shared/config.yml. Partendo da /srv/app, quel testo identifica /srv/shared/config.yml, purché non intervengano altri collegamenti che cambino la risoluzione. Il comando non verifica l’esistenza del file indicato.
Leggere un collegamento assoluto
ln -s /srv/releases/2026-09 /srv/current
readlink /srv/current
Anche questo è un esempio illustrativo: richiede accesso a /srv e un nome current non già presente. Il testo memorizzato e stampato è:
/srv/releases/2026-09
Un percorso assoluto parte dalla radice. Se sposti la struttura in un’altra posizione, il collegamento continua a indicare il vecchio percorso; un collegamento relativo può invece seguire lo spostamento se la posizione reciproca fra collegamento e destinazione rimane invariata.
Verifica dei collegamenti simbolici interrotti
Un collegamento può esistere anche se manca la destinazione. Dalla cartella di prova, con il nome broken-link ancora libero, il blocco seguente crea un collegamento verso missing-target e ne stampa il testo; il file di destinazione non viene creato.
ln -s missing-target broken-link
readlink broken-link
missing-target
Per distinguere il collegamento dalla destinazione puoi usare i test della shell:
if [ -L broken-link ] && [ ! -e broken-link ]; then
printf '%s\n' 'Collegamento simbolico non risolvibile.'
fi
[ -L ... ] verifica che il nome identifichi un collegamento simbolico; [ -e ... ] segue il collegamento e verifica la destinazione. Nella prova con missing-target assente compare il messaggio. In generale un risultato negativo può dipendere anche da accessi negati o da un ciclo di collegamenti: non prova da solo che il file sia stato cancellato. Questi controlli non bloccano modifiche concorrenti.
Normalizzare un percorso con le opzioni GNU
La normalizzazione, o canonicalizzazione, produce un percorso assoluto risolvendo collegamenti e componenti . e ... In questa modalità l’operando non deve necessariamente essere un collegamento simbolico.
| Opzione | Comportamento |
|---|---|
-f, --canonicalize |
Risolve i collegamenti e i componenti punto; le directory che precedono l’ultimo componente devono esistere ed essere accessibili. Il componente finale può mancare. |
-e, --canonicalize-existing |
Tutti i componenti inclusa l'ultima voce devono esistere. |
-m, --canonicalize-missing |
Tratta come directory i componenti mancanti o non disponibili; non garantisce che il risultato esista. |
Ottenere un percorso canonico con -f
readlink -f /srv/current/config.yml
L’esempio richiede che le directory precedenti il nome finale siano risolvibili. Se /srv/current punta a /srv/releases/2026-09, che esiste, e non ci sono altri collegamenti rilevanti, il risultato è /srv/releases/2026-09/config.yml. Con -f il file finale può mancare.
Richiedere tutti i componenti con -e
readlink -e /srv/current/config.yml
Nelle stesse condizioni, -e stampa il percorso soltanto se esiste anche config.yml; una barra finale richiede una directory. Non garantisce che l’oggetto resti invariato fra il controllo e l’apertura né che il suo contenuto sia leggibile.
Ammettere componenti mancanti con -m
readlink -m /srv/future/../uploads/new-file.txt
In assenza di collegamenti rilevanti, l’esempio restituisce /srv/uploads/new-file.txt, anche senza directory già create. -m ammette componenti mancanti o non disponibili, ma continua a risolvere i collegamenti che incontra. Il risultato non garantisce che il percorso esista o possa essere creato.
Gestione di più collegamenti e separazione dell'output
Leggere più collegamenti
GNU readlink accetta più collegamenti. Nella cartella di prova, il comando seguente stampa i tre testi memorizzati:
readlink current previous config-link
Un nome che non è un collegamento non produce una riga di risultato: non associare automaticamente l’ennesima riga all’ennesimo argomento in presenza di errori. Il ciclo seguente mostra anche il nome di ciascun collegamento letto e salta quelli che non riesce a leggere; target è una variabile della shell.
for link in current previous config-link; do
target=$(readlink -- "$link") || continue
printf '%s -> %s\n' "$link" "$target"
done
Distinguere -n e -z
-n, o --no-newline, omette il separatore finale per un solo operando. Nella prova stampa releases/2026-09 senza andare a capo: il prompt del terminale può apparire sulla stessa riga. GNU avverte quando l’opzione è usata con più operandi; non usarla per separare automaticamente più risultati.
readlink -n current
-z, o --zero, termina ogni risultato con il byte NUL, di valore zero, invece di una nuova riga. L’esempio Bash seguente legge quel separatore con read -r -d e stampa i due testi tra parentesi angolari. I byte NUL delimitano i record, ma il testo di destinazione resta quello del collegamento, anche se è relativo o inesistente.
readlink -z current previous |
while IFS= read -r -d '' target; do
printf 'Destinazione: <%s>\n' "$target"
done
Confronto tra readlink, realpath, ls e stat
| Comando | Scopo principale | Caratteristiche |
|---|---|---|
readlink |
Leggere la destinazione memorizzata nel collegamento | Può leggere anche un collegamento interrotto, se il collegamento stesso è accessibile |
realpath |
Normalizzazione dei nomi dei file e calcolo dei percorsi relativi | È il comando preferito dalla documentazione GNU per la canonicalizzazione |
ls -l |
Mostrare collegamento e destinazione in un elenco per persone | Mescola la destinazione con altre informazioni; evita di analizzarne il formato in uno script |
stat |
Esaminare i metadati del collegamento o della destinazione | Mostra identificatore inode, permessi, tempi e tipo; con GNU -L segue il collegamento |
Per il solo testo del collegamento usa readlink; per normalizzazione e relativizzazione usa realpath. La guida a stat approfondisce i metadati. Puoi trovare altri strumenti nella guida ai comandi Linux.
Uso negli script shell
Riconoscere una destinazione relativa
#!/usr/bin/env bash
if [ "$#" -ne 1 ]; then
printf '%s\n' 'Uso: bash tipo-link.sh COLLEGAMENTO' >&2
exit 1
fi
link=$1
target=$(readlink -- "$link") || {
printf '%s\n' 'Impossibile leggere il collegamento simbolico.' >&2
exit 1
}
case "$target" in
/*) printf '%s\n' 'Destinazione assoluta.' ;;
*) printf '%s\n' 'Destinazione relativa.' ;;
esac
Salva il blocco precedente in tipo-link.sh. Esegui bash tipo-link.sh ./current dalla cartella di prova: stampa Destinazione relativa. Per un collegamento con testo che inizia con / stampa Destinazione assoluta. Richiede esattamente un argomento e termina con errore se non può leggere il collegamento. La classificazione riguarda il testo memorizzato, non l’esistenza del file. Una destinazione relativa va risolta dalla directory del collegamento.
Controllare lo stato di uscita
Controlla lo stato del comando anziché dedurre il successo soltanto dall’output. Il blocco seguente è un’alternativa completa per la stessa cartella di prova: assegna il nome a link, stampa la destinazione in caso di successo e termina con errore altrimenti. La sostituzione di comando $(...) elimina le nuove righe finali: questi esempi di visualizzazione non preservano tutti i possibili nomi Unix. Per elaborazioni che devono conservarli, mantieni una separazione NUL e un lettore compatibile; read -d richiede Bash.
link=./current
if target=$(readlink -- "$link"); then
printf '%s\n' "$target"
else
printf 'Impossibile leggere il collegamento: %s\n' "$link" >&2
exit 1
fi
Riepilogo delle principali opzioni
| Opzione | Descrizione |
|---|---|
-f, --canonicalize |
Risolve il percorso ammettendo l’ultimo componente mancante; le directory precedenti devono essere risolvibili. |
-e, --canonicalize-existing |
Tutti i componenti del percorso devono esistere per avere successo. |
-m, --canonicalize-missing |
Tratta come directory i componenti mancanti o non disponibili. |
-n, --no-newline |
Omette il separatore finale quando viene indicato un solo operando. |
-z, --zero |
Termina ogni risultato con un carattere NUL. |
-q, -s, --quiet, --silent |
Sopprime la maggior parte dei messaggi di errore; nelle versioni GNU recenti è il comportamento predefinito se POSIXLY_CORRECT non è impostata. |
-v, --verbose |
Mostra i messaggi di errore; da GNU Coreutils 9.8 è il comportamento predefinito quando POSIXLY_CORRECT è impostata. |
Problemi comuni
Nessun output e stato di errore
Il nome può non essere un collegamento o può essere inaccessibile. Controlla subito $? oppure usa un costrutto if; un comando successivo sostituisce lo stato. Con GNU, aggiungi -v per vedere la diagnosi. Attenzione: readlink -s significa “silenzioso”, mentre realpath -s evita la risoluzione dei collegamenti.
La destinazione relativa sembra errata
Interpreta il testo dalla directory che contiene il collegamento, anche quando chiami readlink da un’altra directory. La lettura del testo e la risoluzione del percorso sono operazioni diverse.
Le opzioni cambiano su un altro sistema
POSIX.1-2024 definisce readlink [-n] file, con un solo operando; -f, -e, -m, -z e le altre opzioni GNU non ne fanno parte. Verifica readlink --help e la documentazione dell’implementazione. POSIX richiede una diagnosi quando l’operando non è un collegamento; GNU è normalmente silenzioso; da Coreutils 9.8, POSIXLY_CORRECT attiva invece la diagnosi predefinita. Nelle versioni precedenti non presumere questa attivazione: usa esplicitamente -v. Per la canonicalizzazione confronta anche le opzioni disponibili di realpath.
Domande frequenti
readlink legge il contenuto del file a cui punta un collegamento simbolico?
No. Nella sua modalità predefinita, restituisce la stringa del percorso di destinazione memorizzata nel file di collegamento. Non legge il contenuto del file di destinazione.
I collegamenti simbolici interrotti possono essere controllati anche con readlink?
Sì, se il collegamento esiste ed è accessibile, la modalità predefinita ne legge il testo anche senza destinazione. Con -e, invece, l’intero percorso risolto deve esistere; -f può ammettere soltanto l’ultimo componente mancante.
Come ottenere un percorso assoluto quando l’output è relativo?
Con GNU puoi usare readlink -f current, rispettando le condizioni di esistenza. Per la normalizzazione generale è preferibile realpath, che offre anche l’output relativo rispetto a una base.
Perché usare readlink invece di ls -l?
ls -l è adatto per elenchi leggibili dall'uomo, mentre readlink produce solo la stringa di destinazione, rendendolo comodo per gli script. Nell'automazione, assicurati di gestire anche lo stato di uscita e la separazione dei nomi dei file.




