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

84

Por que usamos ./filenamepara executar um arquivo no linux?

Por que não inseri-lo como outros comandos gcc, lsetc ...

Renjith G
fonte
A primeira linha não seria melhor escrita como "Por que usamos ./command_namepara executar um comando no linux?"

Respostas:

78

No Linux, UNIX e sistemas operacionais relacionados, .denota o diretório atual. Como você deseja executar um arquivo no seu diretório atual e esse diretório não estiver no seu $PATH, você precisa ./informar o shell onde está o executável. Então, ./foosignifica executar o executável chamado fooque está neste diretório.

Você pode usar typeou whichpara obter o caminho completo de qualquer comando encontrado no seu $PATH.

badp
fonte
5
É muito comum executar programas no diretório atual. Por que o shell não pesquisa lá também? Ele primeiro pesquisa em., Depois em $ PATH.
Michael
também existem aliases que podem atrapalhar, não apenas $PATH.
user2485710
18
@ Michael segurança e sanidade: Se ele pesquisou .primeiro, então seria um problema de segurança, você ou outra pessoa poderia substituir, lspor exemplo (um simples vírus / trojen: crie um arquivo zip com um executável nomeado lsnele, pois alguém está pesquisando , eles executam este executável, que…). Se ele pesquisou pela .última vez, você pode passar um longo tempo enlouquecendo sem saber por que seu programa não está funcionando (por exemplo, você faz um programa chamado teste, em vez de executá-lo, ele executa o programa de teste do sistema. O que não produz saída).
Ctrl-alt-delor 14/03/2015
Também garante que, se o aplicativo ou script aparecer várias vezes no seu caminho, você estiver executando a versão que pretende executar (a que está aqui no diretório ".").
21132 Jim2B
Você pode executar export PATH="$PATH:."para executar o comando no diretório atual se não for encontrado em outras partes PATH, você pode adicionar este em seu arquivo .bashrc
jcubic
99

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

Mas porque? Em suma, é por segurança. Se você está procurando no diretório pessoal de outra pessoa (ou / tmp) e digitando just gccor ls, deseja saber que está executando o real, não uma versão maliciosa que seu amigo brincalhão escreveu que apaga todos os seus arquivos. Outro exemplo seria testou [, que pode substituir esses comandos nos scripts do shell, se o seu shell não os possuir como embutidos.

Ter .como última entrada no seu caminho é um pouco mais seguro, mas existem outros ataques que fazem uso disso. Uma solução fácil é explorar erros de digitação comuns, como slou ls-l. Ou encontre um comando comum que não está instalado nesse sistema - vimpor exemplo, pois os administradores de sistemas têm probabilidade acima da média de digitar isso.

mattdm
fonte
5
Um exemplo prático de alguém tirando pouco a isto: unix.stackexchange.com/questions/7767
mattdm
Apenas tenha caminhos absolutos na PATHvariável de ambiente.
Ed Curar
45

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

$ ls

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

$ a.out

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

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

$ gcc test.c -o test
$ ./test
Simon Whitaker
fonte
Obrigado. Minha dúvida é por que você precisa de ./ no início .... eu consegui o uso de "." (para colocar o diretório atual), mas por que "/" depois disso?
precisa
8
/ é o separador de caminho no Linux, então você o usa para separar o diretório (.) do nome do arquivo (a.out). Sem ele, você tem .a.out, que é um nome de arquivo válido por si só. (Experimente touch .a.out; ls -lApara ver isso.)
Simon Whitaker
5
é assim que você especifica o caminho no Unix, <dir>/<file>então você está basicamente dizendo para executar um arquivo no diretório atual, indicado por./test
Rohan Monga
Red Hat Linux release 9 (Shrike) Kernel 2.4.20-8 em um i686 [renjithg @ cvsserver renjithg] $ touch .a.out; ls -lA total 3 -rw-rw-r-- 1 renjithg renjithg 0 30 de novembro de 13 : 46 .a.out -rwxrwxr-x 1 renjithg renjithg 11669 30 de novembro 13:46 a.out -rw-rw-r-- 1 renjithg renjithg 218 24 de agosto de 2009 aray.c [renjithg @ cvsserver renjithg] $
Renjith G
3
Red Hat Linux 9? Hora de atualizar!
mattdm
4

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

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

No entanto, eu recomendo fortemente que você não faça isso. É ruim, 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

.somethingseria um arquivo oculto (digite "ALT +" para fazê-los aparecer 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.

tiktak
fonte