readlink to małe narzędzie z pakietu GNU coreutils, które odpowiada na jedno pytanie: „dokąd właściwie prowadzi to dowiązanie symboliczne?”. W najprostszej formie wypisuje cel symlinku, a z odpowiednimi flagami potrafi rozwinąć całą ścieżkę do postaci kanonicznej (bezwzględnej, bez ., .. i bez zagnieżdżonych dowiązań po drodze). To dlatego często widzisz je w skryptach instalacyjnych, które chcą poznać prawdziwą lokalizację samego skryptu albo binarki schowanej za kilkoma linkami.
Składnia i najważniejsze opcje
Podstawowa składnia wygląda tak: readlink [OPCJE] PLIK
-f, --canonicalize— rozwija całą ścieżkę rekurencyjnie; wszystkie elementy poza ostatnim muszą istnieć.-e, --canonicalize-existing— jak-f, ale wymaga, by wszystkie elementy ścieżki istniały (inaczej nic nie wypisze).-m, --canonicalize-missing— rozwija ścieżkę bez sprawdzania, czy cokolwiek istnieje (przydatne dla ścieżek, które dopiero powstaną).-n, --no-newline— nie dodaje końcowego znaku nowej linii.-z, --zero— kończy wynik bajtem zerowym zamiast nową linią (do współpracy zxargs -0).-q, --quiet/-s, --silent— wycisza komunikaty o błędach.-v, --verbose— odwrotnie: pokazuje komunikaty o błędach.
Przykłady użycia
readlink /usr/bin/python3— pokazuje, na co wskazuje dowiązanie (np.python3.11).readlink -f ~/projekt/config.yml— zwraca pełną, bezwzględną i rozwiniętą ścieżkę pliku, nawet jeśli idziesz przez kilka symlinków.readlink -f "$0"— klasyk z nagłówka skryptu: ustala, gdzie skrypt naprawdę leży na dysku.readlink -e /etc/alternatives/editor— zwróci ścieżkę tylko wtedy, gdy cel faktycznie istnieje; idealne do walidacji.find . -type l -exec readlink {} \;— wypisuje cele wszystkich dowiązań w bieżącym katalogu.
Częste błędy i pułapki
Najczęstsza wpadka: readlink bez -f na zwykłym pliku (nie-symlinku) nic nie wypisze i zwróci kod błędu — to nie awaria, tak ma być. Druga rzecz: różnice między systemami. Na Linuksie masz GNU coreutils z pełnym zestawem -e i -m, ale na macOS i BSD jest wersja BSD, która zna w zasadzie tylko -f i -n, a flag -e oraz -m tam po prostu nie ma. Jeśli piszesz przenośny skrypt, używaj realpath albo zainstaluj coreutils (brew install coreutils, wtedy masz greadlink).
Powiązane komendy: realpath, ln, stat, ls -l, find.