Justificativa para a /
regra POSIX PATH
A regra foi mencionada em: Por que você precisa de ./ (barra) antes do nome do executável ou do script para executá-lo no bash?mas gostaria de explicar por que acho que esse é um bom design com mais detalhes.
Primeiro, uma versão completa explícita da regra é:
- Se o caminho contém
/
(por exemplo ./someprog
, /bin/someprog
,./bin/someprog
): CWD é utilizado e não é PATH
- se o caminho não contiver
/
(por exemplo someprog
): PATH é usado e CWD não é
Agora, suponha que executando:
someprog
pesquisaria:
- em relação à CWD primeiro
- em relação ao PATH após
Então, se você queria fugir /bin/someprog
da sua distribuição, e fez:
someprog
algumas vezes funcionava, mas outras falhava, porque você pode estar em um diretório que contém outro não relacionado someprog
programa .
Portanto, você aprenderia em breve que isso não é confiável e acabaria sempre usando caminhos absolutos quando desejar usar o PATH, derrotando, portanto, o objetivo do PATH.
É também por isso que ter caminhos relativos no PATH é uma péssima ideia. Eu estou olhando para vocênode_modules/bin
.
Por outro lado, suponha que executando:
./someprog
Pesquisaria:
- em relação ao PATH primeiro
- em relação à DRC após
Então, se você acabou de baixar um script someprog
de um repositório git e quiser executá-lo no CWD, nunca terá certeza de que este é o programa real a ser executado, porque talvez sua distribuição possua:
/bin/someprog
que está no seu PATH de algum pacote que você instalou depois de beber demais depois do Natal do ano passado.
Portanto, mais uma vez, você seria forçado a sempre executar scripts locais relativos ao CWD com caminhos completos para saber o que está executando:
"$(pwd)/someprog"
o que seria extremamente irritante também.
Outra regra que você pode ser tentado a criar seria:
caminhos relativos usam apenas PATH, caminhos absolutos apenas CWD
mas, mais uma vez, isso força os usuários a sempre usar caminhos absolutos para scripts não PATH "$(pwd)/someprog"
.
A /
regra de pesquisa de caminho oferece uma solução simples de lembrar para o problema sobre:
- barra: não use
PATH
- sem barra: use apenas
PATH
o que torna super fácil saber sempre o que você está executando, confiando no fato de que os arquivos no diretório atual podem ser expressos como ./somefile
ou somefile
e, portanto, atribui um significado especial a um deles.
Às vezes, é um pouco chato que você não possa procurar em some/prog
relação a PATH
, mas não vejo uma solução mais saudável para isso.