Meu programa não pode ser executado com o erro "comando não encontrado"

15

Acabei de mudar do Windows para o Ubuntu 11.10.

Escrevi o seguinte código em C com o editor de texto e salvei-o como HelloWorld.c em Documents.

#include <stdio.h>
int main()
{
    printf("Hello World!\n");
    return 0;
}

E eu iniciei o Terminal e digite os seguintes comandos:

cd Documents

gcc HelloWorld.c

Um arquivo chamado a.out, que, após algumas pesquisas no Google, é o executável. Eu digitei este comando:

a.out

Mas eu entendo

a.out: command not found

Qual passo eu dei errado?

yihangho
fonte
Não se esqueça de torná-lo executável, usesudo chmod 777 a.out
Nick Shvelidze
Os compiladores @NickShvelidze sempre estão sempre prontos +xpara você; você não precisa chmoddo executável produzido por um compilador. A única situação comum em que gccfalha em torná-lo executável é se ele estiver criando o arquivo em um sistema de arquivos que não o suporta ou permite (nesse caso, chmodimediatamente depois também falharia). Além disso, 777deve ser evitado. Não há necessidade de torná-lo legível, gravável e executável por todos os usuários; se fosse necessário executar chmod, chmod +x a.outseria suficiente.
Eliah Kagan

Respostas:

33

Como você está executando um executável no diretório de trabalho atual, você deve prefixá-lo ./. Portanto, para o seu programa, execute-o como ./a.out.

Explicação

O terminal procura por executáveis ​​em $PATH. Este é um sistema Unix variável ambiente que exibe os directórios que contêm binários do sistema (tais como ls, echo, ou gcc). Se você chamar um executável que não esteja em um $PATHdiretório (como a.out), será necessário indicar seu caminho absoluto no sistema de arquivos.

No terminal, .é um sinônimo para o diretório de trabalho atual, portanto ./a.out. Você poderia igualmente bem chamar /home/yihang/Documents/a.out.

0x0
fonte
11
Para aprofundar sobre isso, o "./" serve como um comando "aqui". É um pouco redundante, mas útil no sentido de que você sabe que estará executando algo.
Ruben Bakker
11
Você também pode precisar chmod u+x a.outpermitir que o sistema o execute.
Charlesbridge
Agora eu entendi com "./". O programa funciona bem sem chmod. Obrigado.
precisa saber é o seguinte
11
@yihang: considere marcar esta pergunta como respondida, clicando no círculo cinza / verde no lado esquerdo da resposta que você mais gosta.
Rafał Cieślak
@Ruben Bakker: Na verdade, não é de todo redundante. Ao contrário do Windows, o Linux não é padrão para procurar no diretório atual ou padrão. Portanto, se não estiver no caminho, você precisará especificar o diretório, seja ele qual for.
Marty Fried
9

Quando você executa comandos no Linux, ele pesquisa todos os diretórios listados na PATHvariável de ambiente e, se não encontrar o comando lá, você recebe a mensagem que viu.

Normalmente, fica assim:

PATH=/usr/local/bin:/usr/bin:/bin

Isso significa que ele aparecerá primeiro /usr/local/bin. Se não o encontrar, ele procurará /usr/bine assim por diante.

De fato, isso é muito semelhante no DOS / Windows: existe uma variável chamada %PATH%que faz exatamente a mesma coisa.

A diferença é que, no Windows, o diretório atual também é pesquisado. O Unix considera isso ruim porque um arquivo local (como malware) pode substituir programas importantes do sistema acidentalmente.

Se preferir, você pode fazer o Linux funcionar da mesma maneira adicionando .ao caminho:

PATH=.:$PATH

(Isso significa definido PATHcomo .:mais o conteúdo existente de $PATH.)

Ele acaba parecendo algo assim (pode ser diferente na sua máquina):

PATH=.:/usr/local/bin:/usr/bin:/bin

Se você preferir não fazer isso, basta executar cada programa especificando o diretório explicitamente:

./myprog

ou

/home/username/myprog
ams
fonte
2
Se você adicionar .a PATH, sempre adicione-o por último.
Muru
3

Essencialmente, o a.out é criado por padrão porque você não especificou um nome para o executável. Tente isso:

gcc HelloWorld.c -o HelloWorld

Depois de fazer isso, você poderá invocá-lo (como sugeriu Sunil) precedendo "HelloWorld" com uma barra (./):

./HelloWorld

Aqui está um link para um artigo que explica um pouco sobre por que o a.out foi criado: Escrevendo e compilando programas C no Linux .

Aaron
fonte