que
Em geral, este comando deve ser evitado.
Por quê?
Porque ele usa seu ambiente atual ao construir o $PATH
que será avaliado ao procurar executáveis. Isso pode causar confusão ao lidar com scripts de shell e outros, que potencialmente usarão o $PATH
conforme construído pelos arquivos ~/.bashrc
e ~/.bash_profile
quando executados.
Por exemplo:
# path to start
$ echo $PATH
/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/sam/bin
# let's change it
$ export PATH=/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin
$ echo $PATH
/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin
# simulate a new env. for a shell script
$ bash -lc "echo \$PATH"
/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/sam/bin
Observe que o script de shell, se executado, teria o ambiente original, não o atual!
tipo
Você também pode usar o comando type
para localizar executáveis em seu ambiente:
$ type ls
ls is aliased to 'ls --color=auto'
Ou para ver tudo, use a opção -a
:
$ type -a ls
ls is aliased to 'ls --color=auto'
ls is /bin/ls
type
mostrará os aliases e o local. Para encontrar o diretório, a solução @StephaneChazelas de usar command
é melhor.
whereis
Você também pode usar o comando whereis
, mas isso não usa seu ambiente, ele possui um conjunto de diretórios codificados que ele procura. Consulte man whereis para mais detalhes.
localizar
Este pode confundir as pessoas, mas algumas distros incluem uma ferramenta que é executada a partir de um cron job, normalmente diário, que varre todo o disco e constrói um pequeno arquivo de banco de dados que você pode procurar usando o comando locate
.
- O cron job é chamado
/etc/cron.daily/mlocate.cron
no meu sistema Fedora 14.
- A ferramenta que faz a varredura é chamada
/usr/bin/updatedb
.
- O arquivo DB está localizado aqui:
/var/lib/mlocate/mlocate.db
.
Usando o que eu considero um pouco como uma invasão, você pode persuadir o locate
a procurar apenas os arquivos com o nome ls
da seguinte forma:
$ locate -b '\ls'
/bin/ls
/usr/share/javadoc/java-1.6.0-openjdk/api/org/w3c/dom/ls
/usr/share/javadoc/java-1.6.0-openjdk/jre/api/plugin/dom/org/w3c/dom/ls
/usr/share/locale/l10n/ls
/var/cache/abrt-di/usr/src/debug/gcc-4.5.1-20100924/libjava/classpath/external/w3c_dom/org/w3c/dom/ls
/var/cache/abrt-di/usr/src/debug/gcc-4.5.1-20100924/libjava/classpath/gnu/xml/dom/ls
O exemplo acima funciona porque você é \
é um caractere de globbing, portanto, isso desativa a substituição implícita de ls
por *ls*
.
Consulte a página de localização do manual para obter mais detalhes.
whatis
Uma ferramenta menos conhecida é chamada whatis
. Este é semelhante a locate
, então é apoiado por um banco de dados. É útil para descobrir comandos, no entanto:
$ whatis ls
ls (1) - list directory contents
ls (1p) - list directory contents
A ferramenta é invocada a partir de uma tarefa agendada, /etc/cron.daily/makewhatis.cron
. No entanto, makewhatis
constrói seu banco de dados a partir das páginas man
em seu sistema.
Você pode ver mais sobre isso nas páginas do makewhatis man .
Apenas o nome do diretório?
Você pode usar o comando dirpath
contra qualquer saída produzida pelos comandos que mencionei acima para obter apenas o componente de diretório.
dirpath
não faz nenhuma verificação para que você possa fornecer praticamente qualquer tipo de caminho para um arquivo e ele lhe dará a parte do diretório:
$ dirname /some/path/to/a/script
/some/path/to/a