Il primo componente qui indica un elemento del percorso.Esempio :
/home/user/.ssh => <component1>/<component2>/<component3>
1- Supponiamo di avere una struttura di directory come questa :
lols
├── lol
├── lol1 -> lol
└── lol2 -> lol1
E anche la directory inesistente qui sarà lols/lol3Quindi puoi confrontare l'output di ciascun comando:
readlink -f lols/lol1 : /lols/lol
readlink -e lols/lol1 : /lols/lol
L'output qui sarà lo stesso perché tutti i componenti del percorso esistono.
readlink -f lols/lol8 : lols/lol8
readlink -e lols/lol8 : <empty outpyt>
L'output qui è diverso perché con -f mostrerà il risultato perché c'è un componente che esiste almeno nel percorso che è lols e con -e l'output sarà vuoto perché tutti i componenti del percorso devono esistere .
E l'ultimo è avere più directory inesistenti :
readlink -f lols/lol8/lol10 : <empty output>
readlink -e lols/lol8/lol10 : <empty output>
Qui l'output sarà vuoto perché come descritto nella pagina della mappa :-f :tutti tranne l'ultimo componente devono esistere => Non rispettato-o :tutti i componenti devono esistere => Non rispettato
2- Perché non usare solo ls -l :
Supponiamo di creare un file denominato file1 e creare un collegamento simbolico a questo file denominato collegamento1 e da collegamento1 creare un altro collegamento simbolico collegamento2 :
touch file1 : file1
ln -s file1 link1 : link1 -> file1
ln -s link1 link2 : link2 -> link1
Poi con ls -l link2
l'output sarà:link2 -> link1E se usiamo readlink link2
l'output sarà:link1; come ls -lMa se usiamo readlink -f|-e link2
l'output sarà:file1; quindi punterà alla fonte file.
Quindi quando usare readlink invece di ls ?Quando c'è un link simbolico nidificato (Lettura ricorsiva). Quando i file/directory si trovano in posizioni diverse.
Quindi è meglio usare readlink invece di ls per evitare errori.
Ciò è significativo per i collegamenti che seguono un percorso su più di un salto fino al loro obiettivo finale. Ad esempio:
touch test_file
ln -s test_file test_link
ln -s non_existing_target dead_link
ln -s test_link link1
ln -s dead_link link2
In quanto sopra, link1
si sta finalmente collegando a un file, tramite test_link
, quindi -f
e -e
darebbe lo stesso risultato. link2
sta puntando a un link non funzionante e vedi che:
> readlink -e link2
> readlink -f link2
/home/thanasis/temp/non_existing_target
dead_link
è l'"ultimo componente" nell'espressione "tutti tranne l'ultimo componente devono esistere". -f
si sta risolvendo al target che non esiste, mentre -e
non fornisce output.
Nota che man readlink
lo consiglia
realpath
è il comando preferito da utilizzare per la funzionalità di canonicalizzazione
Per questo esempio, realpath -m
, (--missing
) darebbe lo stesso risultato a readlink -f
. In generale realpath -e
è il modo per verificare se un collegamento può essere risolto in un file di destinazione esistente finale, che restituisce l'errore previsto qui:
> realpath -e link2
realpath: link2: No such file or directory
Mentre ls -l
restituisce tutti i risultati e probabilmente ha un output di colore rosso per eventuali link non funzionanti. Anche l'opzione -L
esiste, per dereferenziare i collegamenti e mostrare il loro obiettivo, questo è per gli umani da leggere, non usare mai ls
per decidere qualsiasi cosa su un collegamento all'interno di uno script.