Como é que o whereis está ordenando seus resultados?

3

Ao executar whereis apt , recebo um conjunto de resultados assim:

apt: /usr/bin/apt /usr/lib/apt /etc/apt /usr/share/man/man8/apt.8.gz

Quando eu executo which apt , obtenho

/usr/bin/apt

qual é o primeiro resultado do comando acima. Eu li aqui que isso não é coincidência, e está relacionado à variável $PATH . Então eu corri echo $PATH e consegui:

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

Em seguida, toquei em um arquivo chamado apt in /bin e executei which apt novamente - sem alterações, mesmo com whereis apt alterado para:

apt: /usr/bin/apt /usr/lib/apt /bin/apt /etc/apt /usr/share/man/man8/apt.8.gz

Isso me levou à conclusão de que o ambiente $PATH talvez não seja tudo? Alguém pode esclarecer essa questão? De onde é que whereis obtém as informações?

    
por InsOp 08.01.2018 / 02:08

1 resposta

5

Não tenho certeza se você está perguntando sobre whereis ou which , então vou abordar ambos.

whereis

  

whereis localiza os arquivos binários, de origem e manuais para o   nomes de comandos especificados. (...) [It] tenta localizar o desejado   programa nos locais padrão do Linux e nos locais especificados por    $PATH e $MANPATH .
  (…)
  A maneira mais fácil de saber quais caminhos estão em uso é adicionar a opção de listagem -l .
Origem: man whereis

Execute whereis -l para obter uma lista de caminhos que o programa usa. Por padrão, ele pesquisa arquivos binários, de origem e manuais. Você pode alterar esse comportamento com as opções -b , -s e -m , por exemplo,

$ whereis -m apt
apt: /usr/share/man/man8/apt.8.gz
$ whereis -b apt
apt: /usr/bin/apt /usr/lib/apt /etc/apt

Ao contrário de which (veja abaixo) whereis não testa se o arquivo é executável ao pesquisar binários, é por isso que touch /bin/apt altera sua saída.

which

  

which retorna os nomes de caminho (…) pesquisando o PATH para   arquivos executáveis que correspondem aos nomes dos argumentos.
Source: man which

O que which faz

Eu aceito which essencialmente o mesmo que este comando find :

IFS=':'; find $PATH -mindepth 1 -maxdepth 1 -type f -executable -name "SEARCH"

Ele procura cada diretório presente em PATH por arquivos executáveis chamados SEARCH , por exemplo. para apt :

$ which apt
/usr/bin/apt
$ IFS=':'; find $PATH -mindepth 1 -maxdepth 1 -type f -executable -name "apt"
/usr/bin/apt

Por que sua tentativa falhou

Por padrão, which apenas imprime a correspondência primeiro dos diretórios PATH , ou seja, o arquivo executado. Com touch /bin/apt você criou um arquivo que corresponde à restrição de nome, mas esqueceu de torná-lo executável e não emitiu which para a saída de a ll correspondências. Vamos tentar de novo:

$ touch /bin/apt
$ chmod +x /bin/apt
$ which -a apt
/usr/bin/apt
/bin/apt
$ IFS=':'; find $PATH -mindepth 1 -maxdepth 1 -type f -executable -name "apt"
/usr/bin/apt
/bin/apt
    
por dessert 08.01.2018 / 08:27

Tags