Se dois diretórios diferentes na variável de ambiente PATH contiverem um binário com o mesmo nome (mas com comportamento ligeiramente diferente), existem especificações/garantias sobre qual deles será usado?
Na minha máquina (macOS Monterey, Darwin 21.2.0) observei (via which <binary name>
) que o binário é escolhido no primeiro diretório encontrado em PATH (lendo seu conteúdo da esquerda para a direita). Mas esse comportamento é padrão em todos os sistemas operacionais Linux/UNIX? ou seja, existe algum padrão que o aplique (por exemplo, POSIX)?
Contexto extra (para os curiosos) : estou escrevendo um projeto que possui um script que baixa uma versão personalizada de um binário padrão em uma pasta específica do projeto e depois invoca outro script que DEVE usar o binário personalizado em vez do normal. . Estou adicionando a pasta com o binário personalizado ao PATH antes de invocar o segundo script. Dado o que observei sobre como PATH é pesquisado em caso de colisões, estou definindo PATH como PATH=<my-custom-folder>:$PATH
em vez de PATH=$PATH:<my-custom-folder>
. Mas este projeto tem vários colaboradores e quero ter certeza de que todos executamos o mesmo binário. Se diferentes sistemas operacionais pesquisassem PATH de maneiras diferentes da minha, as coisas iriam quebrar.
POSIX define as chamadas da biblioteca
execlp(3)
eexecvp(3)
procura na variável de ambientePATH
a localização do executável especificado. (A menos que o executável tenha um caminho relativo ou absoluto especificado para seu nome, como/bin/ls
ou./a.out
, isto é.)A definição POSIX de
PATH
é tal que,Um shell POSIX também deve seguir (parte 1e) essa abordagem, mesmo que não adie diretamente a pesquisa
$PATH
para uma dasexec(3)
funções.Portanto, para responder diretamente à sua pergunta, se você tiver um comando não qualificado (como ), será usado
ls
o primeiro executável encontrado em um diretório especificado na lista contida em .$PATH
Não necessariamente um binário, pois os scripts também podem ser executáveis. (Se o comando contiver/
seu nome de caminho, ele será usado diretamente, sendo o diretório atual o ponto de partida para um nome de caminho relativo.)Pensando mais sobre sua necessidade subjacente. Talvez você deva definir sua própria variável de ambiente (
MYAPP_DIR
, por exemplo) que aponta para o diretório que contém os executáveis do seu aplicativo. Você pode então invocar o equivalente$MYAPP_DIR/myutility
em vez de confiar que o usuário$PATH
esteja correto o tempo todo.