Why do we use
./filename to execute a file in linux?
Why not just enter it like other commands
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems. It only takes a minute to sign up.Sign up to join this community
In Linux, UNIX and related operating systems,
. denotes the current directory. Since you want to run a file in your current directory and that directory is not in your
$PATH, you need the
./ bit to tell the shell where the executable is. So,
./foo means run the executable called
foo that is in this directory.
The literal answer is as others have given: because the current directory isn't in your
But why? In short, it's for security. If you're looking in someone else's home directory (or /tmp), and type just
ls, you want to know you're running the real one, not a malicious version your prankster friend has written which erases all your files. Another example would be
[, which might override those commands in shell scripts, if your shell doesn't have those as built-ins.
. as the last entry in your path is a bit safer, but there are other attacks which make use of that. An easy one is to exploit common typos, like
ls-l. Or, find a common command that happens to be not installed on this system —
vim, for example, since sysadmins are of above-average likelyhood to type that.
If you mean, why do you need ./ at the start - that's because (unlike in Windows), the current directory isn't part of your path by default. If you run:
your shell looks for
ls in the directories in your PATH environment variable (
echo $PATH to see it), and runs the first executable called
ls that it finds. If you type:
the shell will do likewise - but it probably won't find an executable called a.out. You need to tell the shell where a.out is - it it's in the current directory (.) then the path is
If you're asking why it's called "a.out", that's just the default output file name for gcc. You can change it with the -o command line arg. For example:
$ gcc test.c -o test $ ./test
You can try to add
:. to your $PATH variable.
Try ALT+F2 and type:
gksudo gedit /etc/environment if running Linux/GTK (this is what you have if using Ubuntu).
HOWEVER, I strongly advise you NOT to do that. It's bad bad bad and bad.
You know, that kind of things work like this since 1970. There is a reason why the current directory isn't included in the $PATH.
. is the current directory
.something would be a hidden file (Type "ALT+" to make them appear in Nautilus, or try "
./someProgram.sh is what you type to RUN an executable someProgram.sh in the current directory.
.somethingElse would mean that you have a hidden executable in the current directory, which is a bad idea.