J'essaie de trouver mon Java dans mon système Linux et j'ai obtenu ceci
[980@b449 ~]$ which Java
/usr/bin/Java
[980@b449 ~]$ readlink -f $(which Java)
/usr/lib/jvm/Java-1.6.0-openjdk-1.6.0.0.x86_64/jre/bin/Java
quelle est la différence entre les 2 commandes?
quelles 2 commandes? /usr/bin/Java
est un lien logiciel (symbolique) vers /usr/lib/jvm/Java-1.6.0-openjdk-1.6.0.0.x86_64/jre/bin/Java
Il n'y a pas de différence car ce sont les mêmes fichiers.
Si vous tapez quelque chose comme
ls -l /usr/bin/Java
Vous pourriez obtenir un résultat tel que:
lrwxrwxrwx. 1 root root 22 Aug 5 17:01 /usr/bin/Java -> /etc/alternatives/Java
Cela signifie que vous pouvez avoir plusieurs versions Java Java sur votre système et utiliser des alternatives pour changer celle par défaut. Sinon, vous pouvez simplement ajouter et supprimer des liens pour changer manuellement celui par défaut.
Pour créer des liens symboliques, utilisez la commande
ln -s /usr/lib/jvm/Java-1.6.0-openjdk-1.6.0.0.x86_64/jre/bin/Java /usr/bin/Java
Ou sous forme générale
ln -s <original file> <link to file>
Et utilisez rm
pour supprimer le lien comme vous supprimeriez tout autre fichier.
canoniser un chemin en suivant récursivement chaque lien symbolique dans chaque composant du nom donné; tous sauf le dernier composant doivent exister
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
ne se soucie pas de savoir 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 à /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 substitut la sortie de which
dans la ligne de commande de readlink -f
créer:
readlink -f /usr/bin/Java
Autrement dit, which
a trouvé l'emplacement du premier fichier exécutable appelé Java
dans votre PATH
, et le shell a inséré ce chemin comme argument dans readlink -f
. readlink
recherche ensuite le chemin et trouve qu'il s'agit d'un lien symbolique , et donc il résout 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 en chemin réel lorsque vous l'utiliserez, et les modifications du fichier lui-même seront effectuées par votre gestionnaire de paquets, plutôt que vous, vous n'avez donc jamais à le voir. Vous pouvez exécuter le programme à partir de l'un ou l'autre chemin, ou avec simplement 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 placer le fichier réel dans /usr/bin
parce que 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 paquets de vous présenter un arrangement normal en tant qu'utilisateur. Il y aura de nombreux autres fichiers dans le /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.
Cette commande sur une seule ligne:
which Java | xargs readlink -f
fera le travail pour vous.
which Java
vous donne, par exemple: /usr/bin/Java
readlink -f
passe par tous les liens symboliques /usr/bin/Java
-> /etc/alternatives/Java
-> /usr/lib/jvm/Java-8-Oracle/jre/bin/Java
et renvoie le dernier.