Como usar o comando which no Linux

Conteúdo

Uma janela de terminal em execução em um laptop Linux.

El Linux which comando identifica o binário executável que é iniciado quando um comando é enviado para o shell. Se você tiver diferentes versões do mesmo programa em seu computador, você pode usar which para descobrir qual o shell usará.

Binários e caminhos

Quando você tenta executar um programa ou comando a partir da janela do terminal, el shell (geralmente, Tentou em distribuições modernas) você tem que encontrar esse comando e executá-lo. Alguns comandos, O que CD, história, e pwd, são construídos no shell, então Bash não precisa se esforçar muito para encontrá-los.

Mas, Como o Bash localiza outros comandos, binários e programas externos independentes? Nós vamos, Bash usa o caminho, que é na verdade uma coleção de rotas, cada um deles aponta para um diretório. Em seguida, ele procura em cada um desses diretórios por um executável que corresponda ao comando ou programa que está tentando executar.. Quando você encontrar um, Bash joga e abandona a busca.

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

echo $ PATH

A lista de saída separa cada rota 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

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

Olha aquelas estradas

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

Não é um ótimo show, ele apenas imprime o número da versão e então fecha. A nova versão é 1.2.138.

Para executar um programa no diretório de trabalho atual, deve escrever “./” delante del nombre del programa, então Bash sabe onde encontrá-lo.

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

Não precisamos do executável em nosso diretório atual, ni necesitamos escribir “./” delante del nombre del programa, como é mostrado a seguir:

sudo mv htg / usr / bin

Agora, Vamos tentar executar o programa digitando:

htg

Algo corre, mas não é nosso programa novo e atualizado. Mais bem, é a versão anterior, 1.2.105.

Aquele que comanda

O problema que demonstramos anteriormente é por que which comando foi desenhado.

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

qual htg

which relata que encontrou uma versão de htg no /usr/local/bin diretório. Como esse local aparece no caminho antes do diretório para o qual movemos a atualização htg, O Bash usa aquela versão mais antiga do programa.

Apesar disto, se usarmos o -a (tudo) opção como mostrado abaixo, which continua procurando mesmo se encontrar uma correspondência:

qual -a htg

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

Então, esse é o problema: existe uma versão mais antiga do programa em um diretório que também está no patch. E esse diretório é pesquisado antes do diretório em que colocamos a nova versão do programa.

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

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

Isso explica o problema e a resposta é simples.

Na realidade, nós temos opções. Podemos remover a versão anterior no /use/local/bin diretório ou movê-lo de /usr/bin para /usr/local/bin.

Veja esses resultados

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

Vejamos um exemplo onde usaremos o which comando com o -a (todo o mundo) e procure versões do less Programa:

qual -a menos

which relata dois locais que hospedam uma versão do less Programa, mas isso é verdade? Seria estranho ter duas versões diferentes (ou a mesma versão em vários locais) a partir de less instalado em um computador Linux. Então, não aceitaremos a partida de which. Em vez de, vamos cavar um pouco mais fundo.

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

ls -lh / usr / bin / less

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

O primeiro personagem da lista é um “eu”. Um arquivo normal teria um traço (-) como primeiro personagem. o “eu” es un símbolo que significa link simbólico. Se você perdeu esse detalhe, a --> O símbolo também indica que é um link simbólico, que você pode considerar como uma espécie de atalho. Este aponta para a cópia de less sobre /bin.

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

ls -lh / bin / menos

Esta entrada es por lo visto un ejecutable binario “real”. O primeiro caractere da lista é um hífen (-), o que significa que é um arquivo normal e o tamanho do arquivo é 167 KB. Então, apenas uma cópia de less está instalado, mas há um link simbólico de outro diretório, que o Bash também encontra ao pesquisar o caminho.

RELACIONADO: Como usar o comando ls para listar arquivos e diretórios no Linux

Verificar vários comandos ao mesmo tempo

Você pode passar vários programas e comandos para which, e os revisará em ordem.

Como um exemplo, se você escrever:

qual ping cat uptime data cabeça

which percorre a lista de programas e comandos que você forneceu e lista o resultado de cada.

Qual qual qual qual?

Se você desejar, você também pode usar which sobre si mesmo escrevendo o seguinte:

qual qual

Enquanto vasculha o sistema de arquivos do Linux por curiosidade, which é mais útil quando você espera um conjunto de comportamentos de um comando ou programa, mas pegue outro.

Você pode usar which nestes casos, para verificar se o comando que você está executando o Bash é o que deseja usar.

setTimeout(função(){
!função(f,b,e,v,n,t,s)
{E se(f.fbq)Retorna;n = f.fbq = função(){n.callMethod?
n.callMethod.apply(n,argumentos):n.queue.push(argumentos)};
E se(!f._fbq)f._fbq = n;n.push = n;n.loaded =!0;n.version = ’2.0′;
n.queue =[];t = b.createElement(e);t.async =!0;
t.src = v;s = b.getElementsByTagName(e)[0];
s.parentNode.insertBefore(t,s) } (window, documento,'roteiro',
‘Https://connect.facebook.net/en_US/fbevents.js ’);
fbq('iniciar', ‘335401813750447’);
fbq('acompanhar', ‘PageView’);
},3000);

Assine a nossa newsletter

Nós não enviaremos SPAM para você. Nós odiamos isso tanto quanto você.