Emplacement Java à partir de / usr / bin / java

20

J'essaie de trouver mon emplacement 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?

user1050619
la source

Réponses:

21

quelles 2 commandes? /usr/bin/javaest un lien doux (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 il s'agit du même fichier.
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 sur votre système et utiliser des alternatives pour changer celle par défaut. Sinon, vous pouvez simplement ajouter et supprimer des liens pour modifier 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 rmpour supprimer le lien comme vous supprimeriez tout autre fichier.

Dani_l
la source
5

readlink -fva :

canoniser un chemin en suivant récursivement chaque lien symbolique dans chaque composant du nom donné; tous sauf le dernier composant doivent exister

whichrecherchera :

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)

whichpeu 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/javaest 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 whichdans la ligne de commande de readlink -fpour créer:

readlink -f /usr/bin/java

C'est-à-dire, whicha trouvé où se trouve le premier fichier exécutable appelé javadans votre PATH, et le shell a inséré ce chemin comme argument vers readlink -f. readlinkrecherche 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 javasera 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/bincar 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_64que vous n'auriez jamais aucune raison de traiter et qui ne participent pas aux arrangements de bibliothèque ordinaires du système.

Michael Homer
la source
0

Cette commande sur une seule ligne:

which java | xargs readlink -f

fera le travail pour vous.

  • which java vous donne à savoir: /usr/bin/java
  • readlink -fpasse par tous les liens symboliques /usr/bin/java-> /etc/alternatives/java-> /usr/lib/jvm/java-8-oracle/jre/bin/javaet renvoie le dernier.
Marek Podyma
la source