Quando um arquivo é executado, como o Unix o procura? Se houver vários arquivos executáveis no PATH com o mesmo nome, qual é o preferido? O diretório atual está incluído na pesquisa quando um arquivo é executado?
Suponha que exista um arquivo com nome executable.sh
no diretório atual. Isso funcionaria se for executado $ executed
e .
não fizer parte do PATH
?
which <executable>
comando de menção será útil neste segmento.Respostas:
O $ PATH é pesquisado do começo ao fim, com o primeiro executável correspondente sendo executado. Portanto, os diretórios no início de $ PATH têm precedência sobre os que vêm mais tarde. Os executáveis no diretório atual (.) São executados apenas se. está em $ PATH (o que geralmente não é ). Não há inclusão implícita do diretório atual no caminho de pesquisa.
fonte
.
, mas parece que ele pesquisaria primeiro o diretório atual antes de verificar os diretórios definidos no próprio $ PATH.Para arquivos no diretório atual, você deverá precedê-los
./
, para que o comando se torne./executable.sh
. Você nunca deve ter.
no seu PATH, pois isso representa um risco à segurança, entre outros problemas.Diretórios que vêm primeiro no PATH e pesquisados primeiro.
A ordem geral da pesquisa é assim se bem me lembro:
aliases
funções exportadas
comandos shell integrados
scripts e binários em seu PATH
fonte
hash -r
) se alterar o PATH ou os locais do programa.Embora isso tenha sido bem respondido por alguns outros, gostaria de acrescentar alguns pensamentos:
1) PATH é consultado apenas se o executável invocado não tiver elementos de caminho. algum comando seria procurado em $ PATH,
./somecommand
ou/usr/bin/somecommand
, ou../../bin/somecommand
apenas use regras de diretório, não PATHEle para no primeiro local encontrado, lendo $ PATH da esquerda para a direita.
Se o diretório atual estiver em PATH, ele será pesquisado. Lembre-se de que um diretório vazio no PATH inclui o diretório atual. por exemplo, PATH =: / usr / bin (vazio à esquerda) PATH = / usr / bin: (à direita vazio) e PATH = / usr / bin :: / bin (vazio no meio) incluirão efetivamente o diretório de trabalho atual.
Nunca o encontraria pesquisando PATH. Se o diretório atual não estiver no PATH, ele não será encontrado por uma pesquisa PATH.
Dito isto (e lamento acrescentar confusão) se houvesse um alias ou função que executasse o comando, ele seria executado. Ou, se o seu shell tiver um cache de localização e o executável estiver no cache, ele poderá ser encontrado. Portanto, nunca o encontrará no PATH, mas pode ser executado por outros meios.
fonte
cache
observação, quase me enlouquece que o antigo executável/usr/bin/
ainda não seja chamado pelo novo/usr/local/bin
, mas fica à esquerda$PATH
até eu sair e entrar novamente.Para ver qual é o seu caminho atualmente, basta digitar
echo $PATH
, ouprintenv PATH
.Então você saberá a ordem da pesquisa. Se você tiver vários arquivos com o mesmo nome, execute o que ____ para ver.
Ex.
uma maneira legal de encontrar arquivos que funcionem como seu destino é usar o propósito:
e assim por diante...
fonte
whereis
usa uma lista codificada de locais, não$PATH
.@ coneslayer - A ordem padrão para encontrar o executável é o caminho atual, comandos internos e, em seguida, o $ PATH. Portanto, se uma função denominada executável já existir no pwd, isso será executado. Caso contrário, a precedência procurará comandos internos do shell e, em seguida, $ PATH
fonte
./
), ele pesquisará apenas esse diretório; caso contrário, ele pesquisa$PATH
.