Why do we use
./filename
to execute a file in linux?Why not just enter it like other commands
gcc
, 'ls' etc.
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.
You can use type
or which
to get the full path of any commands found in your $PATH
.
The literal answer is as others have given: because the current directory isn't in your $PATH
.
But why?
In short, it's for security. If you're looking in someone else's home directory (or /tmp
), and type just gcc
or 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 test
or [
, which might override those commands in shell scripts, if your shell doesn't have those as built-ins.
Having .
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 sl
or 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.