Localização Java em / usr / bin / java

20

Estou tentando encontrar minha localização java no meu sistema Linux e consegui isso

[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

qual é a diferença entre os 2 comandos?

user1050619
fonte

Respostas:

21

quais 2 comandos? /usr/bin/javaé um link suave (simbólico) para /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/bin/java
Não há diferença, pois eles são o mesmo arquivo.
Se você digitar algo como

ls -l /usr/bin/java

Você pode obter um resultado como:

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

O que significa que você pode ter várias versões java no seu sistema e usar alternativas para alterar a padrão. Caso contrário, você pode simplesmente adicionar e remover links para alterar o padrão manualmente.

Para criar links simbólicos, use o comando

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

Ou de forma geral

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

E use rmpara excluir o link como você excluiria qualquer outro arquivo.

Dani_l
fonte
5

readlink -firá :

canonize um caminho seguindo cada link simbólico em cada componente do nome fornecido recursivamente; tudo, exceto o último componente, deve existir

whichirá procurar :

para um executável ou script nos diretórios listados na variável de ambiente PATH usando o mesmo algoritmo que o bash (1)

whichnão se importa se o que encontra é um link simbólico ou não: apenas que é executável. Ele garante que o caminho impresso sempre estará dentro de um dos diretórios do PATH.

No seu sistema, /usr/bin/javaexiste um link simbólico para /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/bin/java. Quando você combina os dois comandos como este, substitui a saída de whichna linha de comando de readlink -fpara criar:

readlink -f /usr/bin/java

Ou seja, whichencontrou onde o primeiro arquivo executável chamado javaestá no seu PATHe o shell inseriu esse caminho como argumento para readlink -f. readlinkdepois, pesquisa o caminho e descobre que é um link simbólico e, portanto, resolve esse link (e quaisquer outros que encontrar) para produzir um caminho direto completo para o próprio arquivo real.

Para quase todos os propósitos, esses caminhos serão intercambiáveis ​​para você - o link simbólico javaserá automaticamente resolvido para o caminho real quando você o usar, e as modificações no próprio arquivo serão feitas pelo seu gerenciador de pacotes, e não por você, para que você nunca tenha ver isso. Você pode executar o programa de qualquer caminho ou apenas java, e o resultado seria exatamente o mesmo, porque é o mesmo executável real que é executado no final.

O gerenciador de pacotes usará um link simbólico, em vez de colocar o arquivo real, /usr/binporque o JRE possui um conjunto inteiro de arquivos que ele gosta de ter ao lado do outro em configurações incomuns, e um link simbólico permite que o gerenciador de pacotes apresente um arranjo de aparência normal para você como usuário. Haverá muitos outros arquivos dentro dos /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64quais você nunca teria motivos para lidar, e que não participam das disposições comuns da biblioteca do sistema.

Michael Homer
fonte
0

Este comando de linha única:

which java | xargs readlink -f

fará o trabalho para você.

  • which java dá-lhe isto: /usr/bin/java
  • readlink -fpassa por todos os links simbólicos /usr/bin/java-> /etc/alternatives/java-> /usr/lib/jvm/java-8-oracle/jre/bin/javae retorna o último.
Marek Podyma
fonte