readlink -f
sarà :
canonicalizzare un percorso seguendo ricorsivamente ogni collegamento simbolico in ogni componente del nome dato; tutti tranne l'ultimo componente devono esistere
which
cercherà :
per un eseguibile o uno script nelle directory elencate nella variabile d'ambiente PATH usando lo stesso algoritmo di bash (1)
which
non importa se quello che trova è un symlink o no: solo che è eseguibile. Garantisce che il percorso che stampa sarà sempre all'interno di una delle directory in PATH
.
Sul tuo sistema, /usr/bin/java
c'è un link simbolico a /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/bin/java
. Quando si combinano i due comandi in questo modo, si sostituisce l'output di which
nella riga di comando di readlink -f
per creare:
readlink -f /usr/bin/java
Cioè, which
ha trovato dove si trova il primo file eseguibile chiamato java
nel tuo PATH
e la shell ha inserito quel percorso come argomento per readlink -f
. readlink
quindi cerca il percorso e scopre che si tratta di un collegamento simbolico , quindi risolve quel collegamento (e tutti gli altri che trova) per produrre un percorso diretto completo al file stesso.
Per quasi tutti gli scopi, questi percorsi saranno intercambiabili con te: il link simbolico java
verrà automaticamente risolto nel percorso reale quando lo utilizzi e le modifiche al file stesso verranno apportate dal gestore dei pacchetti, piuttosto che da te, quindi non hai mai per vederlo. È possibile eseguire il programma da entrambi i percorsi, o con just java
, e il risultato sarebbe esattamente lo stesso, perché è lo stesso eseguibile effettivo che viene eseguito alla fine.
Il gestore pacchetti utilizzerà un collegamento simbolico anziché inserire il file effettivo /usr/bin
perché JRE ha un intero set di file che preferisce avere l'uno accanto all'altro in configurazioni insolite e un collegamento simbolico consente al gestore pacchetti di presentare una disposizione dall'aspetto normale a tu come utente. Ci saranno molti altri file all'interno dei /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64
quali non avresti mai avuto motivo di occuparti e che non partecipano alle normali disposizioni della libreria del sistema.