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.