Mi programa no puede ejecutarse con el error "comando no encontrado"

15

Acabo de cambiar de Windows a Ubuntu 11.10.

Escribí el siguiente código en C con el editor de texto y lo guardé como HelloWorld.c en Documentos.

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

Y comencé la Terminal e ingresé los siguientes comandos:

cd Documents

gcc HelloWorld.c

Un archivo llamado a.out, que, después de una búsqueda en Google, es el ejecutable. Ingresé este comando:

a.out

Pero consigo

a.out: command not found

¿Qué paso hice mal?

yihangho
fuente
No se olvide de hacerlo ejecutable, usesudo chmod 777 a.out
Nick Shvelidze
Los compiladores @NickShvelidze casi siempre están listos +xpara ti; no necesita chmodel ejecutable producido por un compilador. La única situación común en la que gccno se puede hacer que sea ejecutable es si está creando el archivo en un sistema de archivos que no lo admite ni lo permite (en cuyo caso, chmodinmediatamente después también fallaría). Además, se 777debe evitar. No es necesario que todos los usuarios puedan leerlo, escribirlo y ejecutarlo; si fuera necesario correr chmod, chmod +x a.outsería suficiente.
Eliah Kagan

Respuestas:

33

Como está ejecutando un archivo ejecutable en el directorio de trabajo actual, debe agregarle el prefijo ./. Entonces, para su programa, ejecútelo como ./a.out.

Explicación

El terminal busca ejecutables en $PATH. Este es un Unix variable de entorno que enumera los directorios que contienen los binarios del sistema (tales como ls, echo, o gcc). Si llama a un ejecutable que no está en un $PATHdirectorio (como a.out), debe indicar su ruta absoluta en el sistema de archivos.

En la terminal .es un sinónimo del directorio de trabajo actual, por lo tanto ./a.out. Igualmente podrías llamar /home/yihang/Documents/a.out.

0x0
fuente
1
Para más detalles sobre esto, el "./" sirve como un comando "aquí mismo". Es un poco redundante, pero útil en el sentido de que sabes que ejecutarás algo.
Ruben Bakker
1
También es posible que deba chmod u+x a.outpermitir que el sistema lo ejecute.
charlesbridge
Ahora lo entiendo con "./". El programa funciona bien sin chmod. Gracias.
yihangho
1
@yihang: considere marcar esta pregunta como respondida, haciendo clic en el círculo gris / verde en el lado izquierdo de la respuesta que más le guste.
Rafał Cieślak
@Ruben Bakker: En realidad, no es en absoluto redundante. A diferencia de Windows, Linux no busca de manera predeterminada en el directorio actual o predeterminado. Entonces, si no está en la ruta, debe especificar el directorio, sea cual sea.
Marty Fried
9

Cuando ejecuta comandos en Linux, busca todos los directorios enumerados en la PATHvariable de entorno, y si no encuentra el comando allí, recibirá el mensaje que ha visto.

Por lo general, se ve así:

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

Eso significa que se verá primero /usr/local/bin. Si no lo encuentra allí, mirará hacia adentro /usr/bin, y así sucesivamente.

De hecho, esto es muy similar en DOS / Windows: hay una variable llamada %PATH%que hace exactamente lo mismo.

La diferencia es que, en Windows, también se busca en el directorio actual. Unix considera esto malo porque un archivo local (como el malware) puede anular accidentalmente importantes programas del sistema.

Sin embargo, si lo prefiere, puede hacer que Linux funcione de la misma manera agregando .a la ruta:

PATH=.:$PATH

(Eso dice establecer PATHa .:más los contenidos existentes de $PATH).

Termina luciendo así (puede ser diferente en su máquina):

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

Si prefiere no hacerlo, simplemente puede ejecutar cada programa especificando el directorio explícitamente:

./myprog

o

/home/username/myprog
ams
fuente
2
Si agrega .a PATH, siempre añadirlo pasado.
muru
3

Esencialmente, el a.out se crea de manera predeterminada porque no especificó un nombre para el ejecutable. Intenta esto en su lugar:

gcc HelloWorld.c -o HelloWorld

Una vez que haga eso, debería poder invocarlo (como sugirió Sunil) anteponiendo "HelloWorld" con una barra diagonal (./):

./HelloWorld

Aquí hay un enlace a un artículo que explica un poco sobre por qué se crea el a.out: Escritura y compilación de programas C en Linux .

Aaron
fuente