Por que eu tenho que digitar “./” sempre antes de um executável para executá-lo no Linux?

8

Quando eu compilo o egxc:

GCC x.c -o x

Para executar o resultado eu tenho que escrever:

./x

E apenas digitando:

x

Falha com esta mensagem:

x: comando não encontrado

Isso significa que o Linux não procura no diretório atual por ele! Existe (tenho certeza que existe) algum problema razoável por trás desse comportamento?

Yasser Zamani
fonte
Porque são as regras.
Daniel R Hicks
@ DanH: Então explique "as regras", por favor.
Torben Gundtofte-Bruun

Respostas:

13

Porque, por padrão, o diretório de trabalho atual não está na PATHvariável

Esta é uma medida de segurança / conveniência. Se você possui binários / scripts chamados cd, por exemplo , lsetc. no seu diretório de trabalho atual, seria muito irritante se eles fossem executados por padrão.

Oliver Charlesworth
fonte
4
A resposta está apenas parcialmente correta. O problema poderia ser resolvido se o diretório atual fosse usado apenas como última opção. Em seguida, as ferramentas padrão ainda seriam encontradas primeiro.
usuário desconhecido
1
Além disso, builtins shell tomar precedência (ou seja, quando você digita cdem bash, ele executa uma interna rotina para bash e não /bin/cd), a menos que precedido de `.`
LawrenceC
3
Uma das medidas de segurança * nix originais, força os binários compilados pelo sistema ou pelo administrador que estão no comando path atribuído ao sistema a serem executados. Nada tão ruim quanto alguém para fazer login como root em uma pergunta do suporte técnico, acessar um diretório de usuários, digitar ls e descobrir que eles carregaram uma bomba deixada por um usuário.
Fiasco Labs
7
@userunknown: E a primeira vez que você digitou sl, você tem o mesmo problema. Somente diretórios confiáveis ​​devem estar em $PATHcaminhos relativos, como nunca. são um diretório confiável para um shell interativo.
2
@ Básico: Se eu digitar rm -r targetquando quis dizer rm -f target, geralmente não há diferença. Se eu digitar rm -f targetquando quisesse rm -r target, não haverá diferença ou a remoção definitiva falhará. Além disso, acho que todas as vezes antes de digitar rm, especialmente se estou adicionando -fou -rou um globo - é um comando perigoso por natureza. Ninguém pensa antes de lsing.
1

Isso significa que o diretório atual não está na variável $ PATH.

James
fonte
1

Você pode corrigir isso adicionando o diretório atual (representado por um único ponto) à PATHvariável de ambiente.
A maneira de fazer isso depende do shell que você está usando.
se você estiver usando o bash, poderá adicionar a linha export PATH=$PATH:.ao .bashrcarquivo no diretório inicial.
se você estiver usando csh ou tcsh, adicione a linha set PATH = ($PATH .)ao arquivo .cshrc no diretório inicial.
IMHO, para um computador doméstico, isso é algo aceitável - segurança.

kroiz
fonte
Eu não sabia que podemos adicionar. para PATH, no entanto, isso diminuirá a segurança, certo?
Yasser Zamani