Como eu sei o caminho exato e completo da busca do comando Linux whereis

2

Lendo as man pages sobre o comando "whereis" no meu Debian 'wheezy' linux, ele mostra que o arquivo interessado é:

FILES
   /{bin,sbin,etc}

   /usr/{lib,bin,old,new,local,games,include,etc,src,man,sbin,
                           X386,TeX,g++-include}

       /usr/local/{X386,TeX,X11,include,lib,man,etc,bin,games,emacs}

Eu assumo que esses são os caminhos de pesquisa codificados, mas por que eu recebo isso:

root@kali:/bin# whereis gnome
gnome: /usr/share/gnome
root@kali:/bin#

Por que isso é mostrado? Já que não está no caminho assumido?

... e, além disso, é um diretório, não um binário, fonte ou manual.

    
por MaKr0 18.07.2013 / 22:55

2 respostas

1

Bem, isso é porque ele pesquisa no ... uh ... hmmm. Parece que alguém fez alterações no código-fonte, mas esqueceu de atualizar a documentação. Aqui está a lista completa de pastas pesquisadas, diretamente do código-fonte:

static const char *bindirs[] = {
    "/usr/bin",
    "/usr/sbin",
    "/usr/lib",
    "/usr/lib64",
    "/bin",
    "/sbin",
    "/etc",
    "/usr/etc",
    "/lib",
    "/lib64",
    "/usr/games",
    "/usr/games/bin",
    "/usr/games/lib",
    "/usr/emacs/etc",
    "/usr/lib/emacs/*/etc",
    "/usr/TeX/bin",
    "/usr/tex/bin",
    "/usr/interviews/bin/LINUX",

    "/usr/X11R6/bin",
    "/usr/X386/bin",
    "/usr/bin/X11",
    "/usr/X11/bin",
    "/usr/X11R5/bin",

    "/usr/local/bin",
    "/usr/local/sbin",
    "/usr/local/etc",
    "/usr/local/lib",
    "/usr/local/games",
    "/usr/local/games/bin",
    "/usr/local/emacs/etc",
    "/usr/local/TeX/bin",
    "/usr/local/tex/bin",
    "/usr/local/bin/X11",

    "/usr/contrib",
    "/usr/hosts",
    "/usr/include",

    "/usr/g++-include",

    "/usr/ucb",
    "/usr/old",
    "/usr/new",
    "/usr/local",
    "/usr/libexec",
    "/usr/share",

    "/opt/*/bin",
    NULL
};

static const char *mandirs[] = {
    "/usr/man/*",
    "/usr/share/man/*",
    "/usr/X386/man/*",
    "/usr/X11/man/*",
    "/usr/TeX/man/*",
    "/usr/interviews/man/mann",
    NULL
};

static const char *srcdirs[] = {
    "/usr/src/*",
    "/usr/src/lib/libc/*",
    "/usr/src/lib/libc/net/*",
    "/usr/src/ucb/pascal",
    "/usr/src/ucb/pascal/utilities",
    "/usr/src/undoc",
    NULL
};

Fonte

    
por 18.07.2013 / 23:20
0

A melhor idéia que tenho é olhar para o código-fonte .

Existem três matrizes estáticas definidas, uma para o caminho de pesquisa binária, uma para páginas man e outra para origens. Eles incluem os seguintes diretórios (codificados como mencionado na seção BUGS da página man, ou ajustáveis com as opções de linha de comando -B , -M , -S , resp.) - taken da versão 2.23:

  • caminho de pesquisa binária

    "/usr/bin",
    "/usr/sbin",
    "/usr/lib",
    "/usr/lib64",
    "/bin",
    "/sbin",
    "/etc",
    "/usr/etc",
    "/lib",
    "/lib64",
    "/usr/games",
    "/usr/games/bin",
    "/usr/games/lib",
    "/usr/emacs/etc",
    "/usr/lib/emacs/*/etc",
    "/usr/TeX/bin",
    "/usr/tex/bin",
    "/usr/interviews/bin/LINUX",
    "/usr/X11R6/bin",
    "/usr/X386/bin",
    "/usr/bin/X11",
    "/usr/X11/bin",
    "/usr/X11R5/bin",
    "/usr/local/bin",
    "/usr/local/sbin",
    "/usr/local/etc",
    "/usr/local/lib",
    "/usr/local/games",
    "/usr/local/games/bin",
    "/usr/local/emacs/etc",
    "/usr/local/TeX/bin",
    "/usr/local/tex/bin",
    "/usr/local/bin/X11",
    "/usr/contrib",
    "/usr/hosts",
    "/usr/include",
    "/usr/g++-include",
    "/usr/ucb",
    "/usr/old",
    "/usr/new",
    "/usr/local",
    "/usr/libexec",
    "/usr/share",
    "/opt/*/bin"
    
  • caminho de pesquisa da página de manual

    "/usr/man/*",
    "/usr/share/man/*",
    "/usr/X386/man/*",
    "/usr/X11/man/*",
    "/usr/TeX/man/*",
    "/usr/interviews/man/mann"
    
  • caminho de pesquisa de origem

    "/usr/src/*",
    "/usr/src/lib/libc/*",
    "/usr/src/lib/libc/net/*",
    "/usr/src/ucb/pascal",
    "/usr/src/ucb/pascal/utilities",
    "/usr/src/undoc"
    

Além disso, $PATH e $MANPATH também são levados em consideração.

Para a última parte da sua pergunta, por que as pastas são encontradas como binárias, especulo que whereis encontra tudo como binário nas pastas especificadas, mesmo arquivos _un_executáveis (vazios):

$ touch /usr/share/foo
$ whereis foo
foo: /usr/share/foo

Qual é a intenção disso? Eu não sei. Mas, no geral, acho que whereis está um pouco desatualizado. Para encontrar executáveis, o shell embutido where -a [command] é muito mais apropriado.

    
por 18.07.2013 / 23:29