readlink -f
irá :
canonize um caminho seguindo cada link simbólico em cada componente do nome fornecido recursivamente; tudo, exceto o último componente, deve existir
which
irá 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)
which
nã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/java
existe 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 which
na 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 argumento para readlink -f
. readlink
depois, 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 java
será 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/bin
porque 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_64
quais você nunca teria motivos para lidar, e que não participam das disposições comuns da biblioteca do sistema.