Local Java de / usr / bin / java

17

Estou tentando encontrar meu local java dentro do meu sistema Linux e obtive 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?

    
por user1050619 10.08.2014 / 00:27

2 respostas

18

quais 2 comandos? /usr/bin/java é um link 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 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 do java em seu sistema e usar alternativas para alterar o 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 na forma geral

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

E use rm para excluir o link, pois você excluiria qualquer outro arquivo.

    
por 10.08.2014 / 01:01
5

readlink -f :

canonicalize a path by following every symlink in every component of the given name recursively; all but the last component must exist

which pesquisará :

for an executable or script in the directories listed in the environment variable PATH using the same algorithm as bash(1)

which não se importa se o que encontrar é um link simbólico ou não: só que é executável. Garante que o caminho impresso sempre estará dentro de um dos diretórios em PATH .

No seu sistema, /usr/bin/java é 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 juntos, substitui a saída de which em a linha de comando de readlink -f para criar:

readlink -f /usr/bin/java

Ou seja, which encontrou onde o primeiro arquivo executável chamado java está no seu PATH e o shell inseriu esse caminho como um argumento para readlink -f . Em seguida, readlink procura o caminho e descobre que é um link simbólico , e assim resolve esse link (e qualquer outro que encontrar) para produzir um caminho direto completo para o próprio arquivo.

Para quase todos os propósitos, esses caminhos serão intercambiáveis para você - o link simbólico java será automaticamente resolvido para o caminho real quando você usá-lo, e modificações no próprio arquivo serão feitas pelo seu gerenciador de pacotes, em vez de você, então você nunca tem que ver isso. Você poderia executar o programa a partir de qualquer caminho ou com apenas java , e o resultado seria exatamente o mesmo, porque é o mesmo executável real que é executado no final.

O gerenciador de pacotes estará usando um link simbólico em vez de colocar o arquivo real dentro de /usr/bin porque o JRE tem um conjunto inteiro de arquivos que ele gosta de ter próximos uns dos outros em configurações incomuns, e um link simbólico permite que o gerenciador de pacotes um arranjo de aparência normal para você como usuário. Haverá muitos outros arquivos dentro do /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64 com os quais você nunca terá nenhum motivo para lidar, e que não participam dos arranjos de bibliotecas comuns do sistema.

    
por 10.08.2014 / 01:00

Tags