Não tenho certeza se você está perguntando sobre whereis ou which , então vou abordar ambos.
whereis
whereislocaliza 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$PATHe$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
whichretorna 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