A pesquisa PATH é um recurso da biblioteca C padrão no espaço do usuário, assim como as variáveis de ambiente em geral. O kernel não vê variáveis de ambiente, exceto quando passa por um ambiente do responsável pela chamada de execve
para o novo processo.
O kernel não executa nenhuma interpretação no caminho em execve
(cabe às funções do invólucro como execvp
executar a pesquisa PATH) ou em um shebang (que mais ou menos redireciona a chamada execve
internamente). Então você precisa colocar o caminho absoluto no shebang¹. A implementação original do shebang foi apenas algumas linhas de código, e não foi significativamente expandido desde.
Nas primeiras versões do Unix, o shell fez o trabalho de invocar-se quando percebeu que você estava invocando um script. Shebang foi adicionado ao kernel por várias razões (resumindo a justificativa de Dennis Ritchie :
- O chamador não precisa se preocupar se um programa para executar é um script de shell ou um binário nativo.
- O próprio script especifica qual interpretador usar, em vez do chamador.
- O kernel usa o nome do script nos logs.
Os shebangs sem caminhos requerem o aumento do kernel para acessar variáveis de ambiente e processar PATH
, ou fazer com que o kernel execute um programa de espaço do usuário que execute a pesquisa PATH. O primeiro método requer a adição de uma quantidade desproporcional de complexidade ao kernel. O segundo método já é possível com um #!/usr/bin/env
shebang .
¹ Se você colocar um caminho relativo, ele é interpretado relativamente ao diretório atual do processo (não ao diretório que contém o script), o que dificilmente é útil em um shebang.