My program cannot run with "command not found" error
Solution 1
Since you're running an executable in the current working directory, you should prefix it with ./
. So for your program run it as ./a.out
.
Explanation
The terminal searches for executables in $PATH
. This is a Unix environment variable that lists directories containing system binaries (such as ls
, echo
, or gcc
). If you call an executable that's not in a $PATH
directory (such as a.out
), you need to indicate its absolute path in the file system.
In the terminal .
is a synonym for the current working directory, thus ./a.out
. You could equally well call /home/yihang/Documents/a.out
.
Solution 2
When you run commands on Linux it searches all the directories listed in the PATH
environment variable, and if it doesn't find the command there then you get the message you've seen.
Typically it looks like this:
PATH=/usr/local/bin:/usr/bin:/bin
That means it will look first in /usr/local/bin
. If it doesn't find it there it'll look in /usr/bin
, and so on.
In fact, this is very similar on DOS/Windows: there's a variable called %PATH%
that does exactly the same thing.
The difference is that, on Windows, the current directory is also searched. Unix considers this bad because a local file (such as malware) can override important system programs accidentally.
If you prefer that though, you can make Linux work the same way by adding .
to the path:
PATH=.:$PATH
(That says set PATH
to .:
plus the existing contents of $PATH
.)
It ends up looking something like this (it may be different on your machine):
PATH=.:/usr/local/bin:/usr/bin:/bin
If you'd rather not do that, you can simply run each program by specifying the directory explicitly:
./myprog
or
/home/username/myprog
Solution 3
Essentially, the a.out is created by default because you didn't specify a name for the executable. Try this instead:
gcc HelloWorld.c -o HelloWorld
Once you do that, you should be able to invoke it by (as Sunil suggested) prefacing "HelloWorld" with a dot-slash(./):
./HelloWorld
Here's a link to an article that explains a little bit about why the a.out gets created: Writing and Compiling C Programs on Linux.
Related videos on Youtube
yihangho
Updated on September 18, 2022Comments
-
yihangho over 1 year
I just switched from Windows to Ubuntu 11.10.
I wrote the following code in C with the text editor and saved it as HelloWorld.c in Documents.
#include <stdio.h> int main() { printf("Hello World!\n"); return 0; }
And I started the Terminal and enter the following commands:
cd Documents gcc HelloWorld.c
A file called a.out, which, after some search on Google, is the executable. I entered this command:
a.out
But I get
a.out: command not found
Which step did I do wrongly?
-
Nick Shvelidze about 12 yearsDo not forget to make it executable, use
sudo chmod 777 a.out
-
Eliah Kagan almost 7 years@NickShvelidze Compilers pretty much always set
+x
for you; you do not need tochmod
the executable produced by a compiler. The only common situation wheregcc
fails to make it executable is if it's creating the file in a filesystem that doesn't support or allow it (in which casechmod
immediately afterwards would fail too). Also,777
should be avoided. There is no need to make it readable, writable, and executable by all users; if it were necessary to runchmod
, thenchmod +x a.out
would be sufficient.
-
-
yihangho about 12 yearsNow I get it with "./". The program runs fine without chmod. Thanks.
-
Rafał Cieślak about 12 years@yihang: Please consider to mark this question as answered, by clicking the gray/green circle on the left side of the answer you like most.
-
Deepak Verma about 12 years@Ruben Bakker: Actually, it's not at all redundant. Unlike Windows, Linux does not default to looking in the current, or default, directory. So, if it's not in the path, you need to specify the directory, whatever it is.
-
muru over 7 yearsIf you do add
.
toPATH
, always add it last.