Meu programa não pode ser executado com o erro “command not found”

13

Acabei de mudar do Windows para o Ubuntu 11.10.

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

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

Eu iniciei o Terminal e digite os seguintes comandos:

cd Documents

gcc HelloWorld.c

Um arquivo chamado a.out, que, após alguma pesquisa no Google, é o executável. Eu entrei neste comando:

a.out

Mas eu recebo

a.out: command not found

Qual foi o passo errado?

    
por yihangho 07.03.2012 / 12:56

3 respostas

29

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

Explicação

O terminal procura por executáveis em $PATH . Esta é uma variável de ambiente que lista os diretórios que contêm binários do sistema (como ls , echo ou gcc ). Se você chamar um executável que não seja em um diretório $PATH (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 chamar /home/yihang/Documents/a.out .

    
por aruva arumugam 07.03.2012 / 12:59
8

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

Normalmente, é assim:

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

Isso significa que ele será exibido primeiro em /usr/local/bin . Se não encontrar, vai procurar /usr/bin e assim por diante.

Na verdade, isso é muito semelhante no DOS / Windows: há 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 diz set PATH to .: mais o conteúdo existente de $PATH .)

Ele acaba parecendo algo assim (pode ser diferente em 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
    
por ams 08.03.2012 / 14:26
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

Uma vez que você fizer isso, você poderá invocá-lo (como Sunil sugeriu) prefacing "HelloWorld" com uma barra de pontos (./):

./HelloWorld

Aqui está um link para um artigo que explica um pouco sobre porque o a.out é criado: Escrevendo e Compilando Programas C no Linux .

    
por Aaron 07.03.2012 / 14:13