Como o Unix procura por arquivos executáveis?

31

Quando um arquivo é executado, como o Unix o procura? Se houver vários arquivos executáveis no PATH com o mesmo nome, qual deles é o preferido? O diretório atual é incluído na pesquisa quando um arquivo é executado?

Suponha que haja um arquivo com o nome executable.sh no diretório atual. Isso funcionaria se fosse executado $ executed e . não faz parte do PATH ?

    
por Leonid 28.01.2011 / 17:28

5 respostas

32

O $ PATH é pesquisado do começo ao fim, com o primeiro executável correspondente sendo executado. Portanto, os diretórios no início do $ PATH têm precedência sobre os que vêm depois. Executáveis no diretório atual (.) São executados somente se. está em $ PATH (o qual geralmente não é ). Não há inclusão implícita do diretório atual no caminho de pesquisa.

    
por 28.01.2011 / 17:35
14

Para arquivos no diretório atual, você deverá precedê-los com ./ , portanto, o comando se tornará ./executable.sh . Você nunca deve ter . em seu PATH, pois representa um risco de segurança, entre outros problemas.

Diretórios que vêm em primeiro lugar no PATH e pesquisados primeiro.

A ordem geral para pesquisa é assim, se bem me lembro:

  • aliases

  • funções exportadas

  • comandos de shell internos

  • scripts e binários no seu PATH

por 28.01.2011 / 17:34
5

Embora isso tenha sido bem respondido por alguns outros, gostaria de acrescentar alguns pensamentos:

1) O PATH só é consultado se o executável invocado não tiver elementos de caminho. somecommand seria procurado em $ PATH, ./somecommand ou /usr/bin/somecommand , ou ../../bin/somecommand apenas usam regras de diretórios, não PATH

If there are multiple executable files in PATH with the same name which one is preferred?

Ele pára no primeiro que encontrar, lendo $ PATH da esquerda para a direita.

Is current directory included in the search when file is executed?

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 (levando vazio) PATH = / usr / bin: (vazio) e PATH = / usr / bin :: / bin (meio vazio) todos efetivamente incluirão o diretório de trabalho atual.

Suppose there is a file with name executable.sh in a current directory. Would that work if it is executed $ executed and . is not part of the PATH?

Nunca iria encontrá-lo pesquisando o PATH. Se a pasta atual não estiver no PATH, ela não será encontrada por uma pesquisa PATH.

Dito isto (e desculpe adicionar 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á encontrá-lo. Então, ele irá nunca encontrá-lo no PATH, mas pode ser executado por outros meios.

    
por 29.01.2011 / 00:48
2

Para ver qual é o seu caminho atualmente, digite echo $PATH ou printenv PATH .

Então você saberá a ordem da pesquisa. Se você tiver vários arquivos com o mesmo nome, apenas execute qual

por 28.01.2011 / 17:39
-2

@ coneslayer- A ordem padrão de encontrar executável é o caminho atual, comandos incorporados e, em seguida, o $ PATH. Então, se uma função chamada executável já existir no pwd, então isso é executado. Se não, então a precedência procura pelos comandos internos do shell e, em seguida, $ PATH

    
por 12.07.2018 / 18:57

Tags