web-dev-qa-db-fra.com

Java emplacement depuis / usr / bin / java

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?

20
user1050619

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.

21
Dani_l

readlink -f sera :

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

6
Michael Homer

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.
0
Marek Podyma