readlink -f
va :
canoniser un chemin en suivant récursivement chaque lien symbolique dans chaque composant du nom donné; tous sauf le dernier composant doivent exister
which
recherchera :
pour un exécutable ou un script dans les répertoires répertoriés dans la variable d'environnement PATH en utilisant le même algorithme que bash (1)
which
peu importe si ce qu'il trouve est un lien symbolique ou non: juste qu'il est exécutable. Il garantit que le chemin qu'il imprime sera toujours dans l'un des répertoires de PATH
.
Sur votre système, /usr/bin/java
est un lien symbolique vers /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/bin/java
. Lorsque vous combinez les deux commandes ensemble comme ceci, vous remplacez la sortie de which
dans la ligne de commande de readlink -f
pour créer:
readlink -f /usr/bin/java
C'est-à-dire, which
a trouvé où se trouve le premier fichier exécutable appelé java
dans votre PATH
, et le shell a inséré ce chemin comme argument vers readlink -f
. readlink
recherche ensuite le chemin et constate qu'il s'agit d'un lien symbolique , et il résout donc ce lien (et tous les autres qu'il trouve) pour produire un chemin direct complet vers le fichier lui-même.
Dans presque tous les cas, ces chemins vous seront interchangeables - le lien symbolique java
sera automatiquement résolu vers le vrai chemin lorsque vous l'utiliserez, et les modifications du fichier lui-même seront effectuées par votre gestionnaire de paquets, plutôt que par vous, donc vous n'avez jamais voir ça. Vous pouvez exécuter le programme à partir de l'un ou l'autre chemin, ou avec juste java
, et le résultat serait exactement le même, car c'est le même exécutable réel qui s'exécute à la fin.
Le gestionnaire de packages utilisera un lien symbolique plutôt que de mettre le fichier réel à l'intérieur /usr/bin
car le JRE a tout un ensemble de fichiers qu'il aime avoir côte à côte dans des configurations inhabituelles, et un lien symbolique permet au gestionnaire de packages de présenter un arrangement d'aspect normal à vous en tant qu'utilisateur. Il y aura de nombreux autres fichiers dans le fichier /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64
que vous n'auriez jamais aucune raison de traiter et qui ne participent pas aux arrangements de bibliothèque ordinaires du système.