Por que usamos “./” para executar um arquivo?

77

Por que usamos ./filename para executar um arquivo no linux?

Por que não basta inseri-lo como outros comandos gcc , ls etc ...

    
por Renjith G 30.11.2010 / 09:28

4 respostas

72

No Linux, UNIX e sistemas operacionais relacionados, . indica o diretório atual. Como você deseja executar um arquivo no diretório atual e esse diretório não está no seu $PATH , você precisa do ./ bit para informar ao shell onde está o executável. Então, ./foo significa executar o executável chamado foo que está nesse diretório.

Você pode usar type ou which para obter o caminho completo de todos os comandos encontrados em seu $PATH .

    
por 30.11.2010 / 09:32
90

A resposta literal é como os outros já deram: porque o diretório atual não está no seu $PATH .

Mas por quê? Em suma, é por segurança. Se você estiver procurando no diretório pessoal de outra pessoa (ou / tmp) e digitar apenas gcc ou ls , você quer saber se está executando a versão real, não uma versão mal-intencionada que seu amigo brincalhão escreveu e apaga todos os seus arquivos. Outro exemplo seria test ou [ , que pode substituir esses comandos em scripts de shell, se o seu shell não tiver esses como internos.

Ter . como entrada última em seu caminho é um pouco mais seguro, mas há outros ataques que fazem uso disso. Um fácil é explorar erros comuns, como sl ou ls-l . Ou, encontre um comando comum que por acaso não esteja instalado neste sistema - vim , por exemplo, já que sysadmins são de probabilidade acima da média para digitar isso.

    
por 01.12.2010 / 05:03
44

Se você quer dizer, por que você precisa ./ no início - isso é porque (diferentemente do Windows), o diretório atual não faz parte do seu caminho por padrão. Se você correr:

$ ls

seu shell procura por ls nos diretórios em sua variável de ambiente PATH ( echo $PATH para vê-lo) e executa o primeiro executável chamado ls que encontra. Se você digitar:

$ a.out

o shell fará o mesmo - mas provavelmente não encontrará um executável chamado a.out. Você precisa dizer ao shell onde a.out está - ele está no diretório atual (.), Então o caminho é ./a.out .

Se você está perguntando por que é chamado de "a.out", esse é apenas o nome do arquivo de saída padrão para o gcc. Você pode alterá-lo com o argumento da linha de comando -o. Por exemplo:

$ gcc test.c -o test
$ ./test
    
por 30.11.2010 / 09:32
4

Você pode tentar adicionar :. à sua variável $ PATH.

Tente ALT + F2 e digite: gksudo gedit /etc/environment se estiver executando o Linux / GTK (isso é o que você tem se estiver usando o Ubuntu).

No entanto, eu recomendo strongmente que você NÃO faça isso. É ruim, ruim e ruim.

Você sabe, esse tipo de coisa funciona assim desde 1970. Há uma razão pela qual o diretório atual não está incluído no $ PATH.

. é o diretório atual

.something seria um arquivo oculto (digite "ALT +" para que eles apareçam no Nautilus ou tente " ls -la ".

./someProgram.sh é o que você digita para EXECUTAR um executável someProgram.sh no diretório atual.

.somethingElse significaria que você tem um executável oculto no diretório atual, o que é uma má ideia.

    
por 02.05.2011 / 23:31