Ubicación de Java desde / usr / bin / java

20

Estoy tratando de encontrar mi ubicación de Java dentro de mi sistema Linux y obtuve esto

[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

¿Cuál es la diferencia entre los 2 comandos?

usuario1050619
fuente

Respuestas:

21

cuales 2 comandos? /usr/bin/javaes un enlace suave (simbólico) a /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/bin/java
No hay diferencia ya que son el mismo archivo.
Si escribes algo como

ls -l /usr/bin/java

Puede obtener un resultado como:

lrwxrwxrwx. 1 root root 22 Aug  5 17:01 /usr/bin/java -> /etc/alternatives/java

Lo que significaría que puede tener varias versiones de Java en su sistema y usar alternativas para cambiar la predeterminada. De lo contrario, simplemente puede agregar y eliminar enlaces para cambiar el predeterminado de forma manual.

Para crear enlaces simbólicos usa el comando

ln -s /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/bin/java /usr/bin/java

O en forma general

ln -s <original file> <link to file>

Y use rmpara eliminar el enlace como eliminaría cualquier otro archivo.

Dani_l
fuente
5

readlink -fhará :

canonicalizar una ruta siguiendo cada enlace simbólico en cada componente del nombre dado de forma recursiva; todos menos el último componente debe existir

whichbuscará :

para un ejecutable o script en los directorios enumerados en la variable de entorno PATH usando el mismo algoritmo que bash (1)

whichno le importa si lo que encuentra es un enlace simbólico o no: solo que es ejecutable. Garantiza que la ruta que imprima siempre estará dentro de uno de los directorios PATH.

En su sistema, /usr/bin/javaes un enlace simbólico a /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/bin/java. Cuando combina los dos comandos juntos de esta manera, sustituye la salida de whichen la línea de comandos de readlink -fcrear:

readlink -f /usr/bin/java

Es decir, whichse ha encontrado que el primer archivo ejecutable llamado javaestá en su PATH, y la cáscara ha insertado ese camino como un argumento a readlink -f. readlinkluego busca la ruta y descubre que es un enlace simbólico , por lo que resuelve ese enlace (y cualquier otro que encuentre) para producir una ruta directa completa al archivo real.

Para casi todos los propósitos, estas rutas serán intercambiables para usted: el enlace simbólico javase resolverá automáticamente a la ruta real cuando lo use, y su administrador de paquetes realizará las modificaciones en el archivo, en lugar de usted, por lo que nunca tendrá para verlo. Puede ejecutar el programa desde cualquier ruta o con solo java, y el resultado sería exactamente el mismo, porque es el mismo ejecutable real que se ejecuta al final.

El administrador de paquetes usará un enlace simbólico en lugar de poner el archivo real en su interior /usr/binporque el JRE tiene un conjunto completo de archivos que le gusta tener uno al lado del otro en configuraciones inusuales, y un enlace simbólico permite que el administrador de paquetes presente una disposición de aspecto normal para usted como usuario Habrá muchos otros archivos dentro de los /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64que nunca tendría ninguna razón para tratar, y que no participan en los arreglos ordinarios de la biblioteca del sistema.

Michael Homer
fuente
0

Este comando de línea única:

which java | xargs readlink -f

hará el trabajo por ti.

  • which java le da es decir: /usr/bin/java
  • readlink -fpasa por todos los enlaces simbólicos /usr/bin/java-> /etc/alternatives/java-> /usr/lib/jvm/java-8-oracle/jre/bin/javay devuelve el último.
Marek Podyma
fuente