První komponenta zde znamená prvek cesty. Příklad :
/home/user/.ssh => <component1>/<component2>/<component3>
1- Předpokládejme, že máme strukturu adresářů takto:
lols
├── lol
├── lol1 -> lol
└── lol2 -> lol1
A také neexistující adresář zde bude lols/lol3Takže můžete porovnat výstup každého příkazu:
readlink -f lols/lol1 : /lols/lol
readlink -e lols/lol1 : /lols/lol
Výstup zde bude stejný, protože všechny komponenty cesty existují.
readlink -f lols/lol8 : lols/lol8
readlink -e lols/lol8 : <empty outpyt>
Výstup je zde odlišný, protože s -f zobrazí výsledek, protože existuje jedna komponenta který existuje alespoň v cestě, která je lols a s -e výstup bude prázdný, protože všechny komponenty cesty musí existovat .
A poslední je s několika neexistujícími adresáři:
readlink -f lols/lol8/lol10 : <empty output>
readlink -e lols/lol8/lol10 : <empty output>
Zde bude výstup prázdný, protože jak je popsáno na stránce mapy :-f :musí existovat všechny komponenty kromě poslední => Nerespektováno-o :všechny komponenty musí existovat => Nerespektováno
2- Proč nepoužít pouze ls -l :
Předpokládejme, že vytvoříme soubor s názvem soubor1 a vytvoříme asymlink na tento soubor s názvem link1 az odkazu1 vytvoříme další symbolický odkaz link2 :
touch file1 : file1
ln -s file1 link1 : link1 -> file1
ln -s link1 link2 : link2 -> link1
Poté pomocí ls -l link2
výstup bude:link2 -> link1A pokud použijeme readlink link2
výstup bude:link1; stejné jako ls -lAle pokud použijeme readlink -f|-e link2
výstup bude:soubor1; takže bude ukazovat na zdroj soubor.
Kdy tedy použít readlink místo ls ?Když jsou vnořené symlinky (Rekurzivní čtení). Když jsou soubory/adresáře na jiném místě.
Proto je lepší použít readlink místo ls abyste se vyhnuli chybám.
To má smysl pro odkazy sledující trasu přes více než jeden skok až do svého konečného cíle. Například:
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
Ve výše uvedeném link1
se konečně připojuje k souboru prostřednictvím test_link
, takže -f
a -e
by dal stejný výsledek. link2
ukazuje na mrtvý odkaz a vidíte, že:
> readlink -e link2
> readlink -f link2
/home/thanasis/temp/non_existing_target
dead_link
je "poslední komponenta" ve výrazu "musí existovat všechny komponenty kromě poslední". -f
řeší na cíl, který neexistuje, zatímco -e
nedává žádný výstup.
Všimněte si, že man readlink
doporučuje to
realpath
je preferovaný příkaz k použití pro funkci kanonizace
V tomto příkladu realpath -m
, (--missing
) by dal stejný výstup na readlink -f
. Obecně realpath -e
je způsob, jak otestovat, zda lze odkaz přeložit na konečný existující cílový soubor, který zde vrací očekávanou chybu:
> realpath -e link2
realpath: link2: No such file or directory
Zatímco ls -l
vrátí všechny výsledky a pravděpodobně má výstup v červené barvě pro všechny nefunkční odkazy. Také možnost -L
existuje, pro dereferencování odkazů a zobrazení jejich cíle je to pro lidi ke čtení, nikdy nepoužívejte ls
rozhodnout o čemkoli o odkazu uvnitř skriptu.