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.