Como usar o comando which no Linux

O comando do Linux identifica o binário executável que é iniciado quando você emite um comando para o shell. Se você tiver versões diferentes do mesmo programa em seu computador, poderá usá-las para descobrir qual delas o shell usará.

Binários e caminhos

Quando você tenta executar um programa ou comando a partir da janela do terminal, o shell (geralmente, Bash em distribuições modernas) precisa encontrar esse comando e iniciá-lo. Alguns comandos, como CD, história, e pwd, são integrados ao shell, de modo que o Bash não precisa trabalhar muito para encontrá-los.

Mas como o Bash localiza outros comandos, programas e binários externos independentes? Bem, o Bash usa o caminho, que na verdade é uma coleção de caminhos, cada um apontando para um diretório. Em seguida, ele procura em cada um desses diretórios um executável que corresponda ao comando ou programa que você está tentando executar. Quando encontra um, Bash o inicia e abandona a pesquisa.

Você pode usar echo para verificar a variável de ambiente $ PATH e ver os diretórios em seu caminho. Para fazer isso, digite o seguinte e pressione Enter:

echo $PATH

O

A lista de saída separa cada caminho com dois pontos (:). No computador que estamos usando, o Bash pesquisará os seguintes diretórios nesta ordem:

/ usr / local / sbin
/ usr / local / bin
/ usr / sbin
/ usr / bin
/ sbin
/ bin
/ user / games
/ usr / local / games
/ snap / bin

  Como fazer upgrade para Linux Mint 20.2

Existem muitas pastas chamadas / sbin e / bin no sistema de arquivos, o que pode causar alguma confusão.

Observe esses caminhos

Digamos que temos uma versão atualizada de um programa chamado htg. Ele está em nosso diretório atual e podemos executá-lo digitando o seguinte comando:

./htg

O

Não é exatamente um programa – ele apenas imprime o número da versão e depois fecha. A nova versão é 1.2.138.

Para executar um programa no diretório de trabalho atual, você deve digitar “./” antes do nome do programa, para que o Bash saiba onde encontrá-lo.

Como queremos executar esse programa específico a partir de qualquer diretório, vamos mover o executável para o diretório / usr / bin. O Bash encontrará esse programa no caminho e o executará para nós.

Não precisamos do executável em nosso diretório atual, nem precisamos digitar “./” na frente do nome do programa, conforme mostrado abaixo:

sudo mv htg /usr/bin

O

Agora, vamos tentar executar o programa digitando:

htg

O

Algo está funcionando, mas não é nosso programa novo e atualizado. Em vez disso, é a versão mais antiga, 1.2.105.

O qual Comando

O problema que demonstramos acima é por que o comando which foi designado.

Neste exemplo, usaremos qual e passaremos o nome do programa que estamos investigando como um parâmetro de linha de comando:

which htg

O

que relata que foi encontrada uma versão do htg no diretório / usr / local / bin. Como esse local aparece no caminho antes do diretório para o qual movemos o htg atualizado, o Bash usa essa versão anterior do programa.

  Como executar Linux em um iPad

No entanto, se usarmos a opção -a (tudo) conforme mostrado abaixo, que continua a pesquisa mesmo se encontrar uma correspondência:

which -a htg

O

Em seguida, ele lista todas as correspondências em qualquer um dos diretórios no caminho.

Portanto, esse é o problema – há uma versão anterior do programa em um diretório que também está no patch. E esse diretório está sendo pesquisado antes do diretório em que descartamos a nova versão do programa.

Para verificar, podemos digitar o seguinte e executar explicitamente cada versão do programa:

/usr/local/bin/htg
/usr/bin/htg

Isso explica o problema e a solução é simples.

Na verdade, temos opções. Podemos excluir a versão antiga do diretório / use / local / bin ou movê-la de / usr / bin para / usr / local / bin.

Veja esses resultados

Dois resultados não significam necessariamente dois arquivos binários.

Vejamos um exemplo em que usaremos o comando which com a opção -a (all) e procuraremos as versões do programa less:

which -a less

O

que relata dois locais que abrigam uma versão do programa less, mas isso é verdade? Seria estranho ter duas versões diferentes (ou a mesma versão em vários locais) ou menos instalado em um computador Linux. Portanto, não vamos aceitar a saída de qual. Em vez disso, vamos cavar um pouco mais fundo.

Podemos usar as opções ls, -l (lista longa) e -h (legível para humanos) para ver o que está acontecendo:

ls -lh /usr/bin/less

O

O tamanho do arquivo é relatado como nove bytes! Definitivamente, não é uma cópia completa do less.

  Como alterar o gerenciador de exibição no Linux

O primeiro caractere da lista é um “l”. Um arquivo normal teria um hífen (-) como primeiro caractere. O “l” é um símbolo que significa link simbólico. Se você perdeu esse detalhe, o símbolo -> também indica que este é um link simbólico, que você pode considerar como uma espécie de atalho. Este aponta para a cópia de menos em / bin.

Vamos tentar novamente com a versão de less em / bin:

ls -lh /bin/less

O

Esta entrada é obviamente um executável binário “real”. O primeiro caractere da lista é um hífen (-), o que significa que é um arquivo normal e o tamanho do arquivo é 167 KB. Portanto, apenas uma cópia de less é instalada, mas há um link simbólico para ele em outro diretório, que o Bash também encontra ao pesquisar o caminho.

Verificando vários comandos ao mesmo tempo

Você pode passar vários programas e comandos para os quais, e ele os verificará em ordem.

Por exemplo, se você digitar:

which ping cat uptime date head

O

que funciona através da lista de programas e comandos que você forneceu e lista o resultado para cada um.

Qual qual é qual?

Se você quiser, também pode usar qual em si mesmo digitando o seguinte:

which which

Além de vasculhar o sistema de arquivos do Linux por curiosidade, o que é mais útil quando você espera um conjunto de comportamentos de um comando ou programa, mas obtém outro.

Você pode usar o qual, nesses casos, para verificar se o comando que o Bash está iniciando é o que deseja usar.