por que ./ é necessário para executar um arquivo executável?

9

Estou usando o ubuntu e percebo que muitos dos meus scripts executáveis ​​não serão executados, a menos que eu anteceda o tema ./.

Por exemplo, se eu tiver um script perl: /home/me/script.ple atualmente estiver /home/medigitando script.pl, não fará isso, mas ./script.plsim.

Por que é que?

David B
fonte
@David B runnable file => executable file:?
Lazer

Respostas:

13

Para executar um script, é necessário digitar o caminho completo do script , a menos que o script esteja presente em um dos diretórios listados em sua $PATHvariável de ambiente. Geralmente (e por padrão) .(o diretório atual) não está no seu $PATH, então você precisa digitar ./scriptpara executá-lo.

mipadi
fonte
21

Porque o diretório atual não está no seu caminho. Este é um recurso de segurança. Se estivesse no seu caminho, alguém poderia potencialmente soltar uma cópia maliciosa de um comando comum e, quando você estiver nesse diretório, em vez de executar o sudo real, por exemplo, você executaria o falso. Isso seria uma coisa ruim.

Matt Greer
fonte
3
Isso é um pouco enganador. Enquanto .estavam atrás /usr/bin/, não seria substituir o real sudo. É para garantir que você não adicione acidentalmente programas ao seu caminho, mas não se trata principalmente de substituir os existentes.
Matthew Flaschen
Em vez de sudo, eu usaria lse rm. Muito mais provável de ser chamado.
Aaron Digulla
@ Aaron: certeza, mas lsnão vai pedir a sua senha e se o usuário pode usar sudoa senha é interessante ...;)
laurent
11
@Mateus. Sim, ainda é difícil de explorar, mas é um risco de segurança real. Digamos que eu coloquei um script slque faz coisas ruins, depois invoca lse se exclui. Você não pode substituir as ferramentas do sistema, mas você pode 'typosquat'
rico Homolka
@laurent: O que eu tinha em mente era: cp /bin/bash /tmp/sfhsdh ; chmod u+s tmp/sfhsdh >& /dev/null ; $0 "$@". Não há necessidade de saber a senha.
Aaron Digulla
4
echo $PATH

Você deve ter o diretório atual (um único ponto) em seu caminho para que isso funcione.

Você pode adicioná-lo ao seu caminho, se desejar, com os seguintes comandos.

sh / bash: export PATH=$PATH:.

tcsh / csh: set PATH = ($PATH .)


fonte
3

o shell pesquisa executáveis ​​no caminho e, por padrão, ./não está no caminho.

Emyr
fonte