Dan Abramov Dan Abramov - 4 months ago 10
Bash Question

Why do you need ./ (dot-slash) before script name to run it in bash?

When running scripts in bash, I have to write

./
in the beginning:

$ ./manage.py syncdb


If I don't, I get an error message:

$ manage.py syncdb
-bash: manage.py: command not found


What is the reason for this? I thought
.
is an alias for current folder, and therefore these two calls should be equivalent.

I also don't understand why I don't need
./
when running applications, such as:

user:/home/user$ cd /usr/bin
user:/usr/bin$ git


(which runs without
./
)

Answer

Because on Unix, usually, the current directory is not in $PATH.

When you type a command the shell looks up a list of directories, as specified by the PATH variable. The current directory is not in that list.

The reason for not having the current directory on that list is security.

Let's say you're root and go into another user's directory and type sl instead of ls. If the current directory is in PATH, the shell will try to execute the sl program in that directory (since there is no other sl program). That sl program might be malicious.

EDIT

That sl part was just an example. The directories in PATH are searched sequentially and when a match is made that program is executed. So, depending on how PATH looks, typing a normal command may or may not be enough to run the program in the current directory.