readlink

Wyświetla cel dowiązania symbolicznego lub rozwiązaną ścieżkę.

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 z xargs -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.