readlink -f
będzie :
kanonizować ścieżkę, rekurencyjnie podążając za każdym dowiązaniem symbolicznym w każdym komponencie danej nazwy; wszystkie oprócz ostatniego komponentu muszą istnieć
which
wyszuka :
dla pliku wykonywalnego lub skryptu w katalogach wymienionych w zmiennej środowiskowej PATH przy użyciu tego samego algorytmu co bash (1)
which
nie obchodzi, czy to, co znajduje, jest dowiązaniem symbolicznym, czy nie: wystarczy, że jest wykonywalne. Gwarantuje, że ścieżka, którą drukuje, zawsze będzie znajdować się w jednym z katalogów w PATH
.
W twoim systemie /usr/bin/java
jest dowiązanie symboliczne do /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/bin/java
. Po połączeniu dwóch poleceń razem w ten sposób, podstawiasz wynik which
polecenia w wierszu poleceń w readlink -f
celu utworzenia:
readlink -f /usr/bin/java
Znaczy to, which
że java
w twoim pliku znajduje się pierwszy wywoływany plik wykonywalny PATH
, a powłoka wstawiła tę ścieżkę jako argument readlink -f
. readlink
następnie wyszukuje ścieżkę i stwierdza, że jest to dowiązanie symboliczne , więc rozwiązuje to dowiązanie (i wszelkie inne znalezione), aby utworzyć pełną bezpośrednią ścieżkę do samego pliku.
Dla prawie wszystkich celów ścieżki te będą dla ciebie wymienne - dowiązanie symboliczne java
zostanie automatycznie przetłumaczone na prawdziwą ścieżkę, gdy z niej skorzystasz, a zmiany w samym pliku zostaną wprowadzone przez menedżera pakietów, a nie przez Ciebie, więc nigdy nie masz żeby to zobaczyć. Możesz uruchomić program z dowolnej ścieżki lub z just java
, a wynik byłby dokładnie taki sam, ponieważ jest to ten sam rzeczywisty plik wykonywalny, który działa na końcu.
Menedżer pakietów będzie używał dowiązania symbolicznego, zamiast umieszczać rzeczywisty plik w środku, /usr/bin
ponieważ środowisko JRE zawiera cały zestaw plików, które lubi mieć obok siebie w nietypowych konfiguracjach, a dowiązanie symboliczne pozwala menedżerowi pakietu przedstawić normalnie wyglądające ustawienie ty jako użytkownik. Wewnątrz będzie wiele innych plików, z /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64
którymi nigdy nie miałbyś powodu się zajmować i które nie uczestniczą w zwykłych aranżacjach bibliotek systemu.