It's a convention so the *nix shell knows what kind of interpreter to run.
For example, older flavors of ATT defaulted to sh (the Bourne shell), while older versions of BSD defaulted to csh (the C shell).
Even today (where most systems run bash, the "Bourne Again Shell"), scripts can be in bash, python, perl, ruby, PHP, etc, etc. For example, you might see #!/bin/perl
or #!/bin/perl5
.
PS:
The exclamation mark (!
) is affectionately called "bang". The shell comment symbol (#
) is sometimes called "hash".
PPS:
Remember - under *nix, associating a suffix with a file type is merely a convention, not a "rule". An executable can be a binary program, any one of a million script types and other things as well. Hence the need for #!/bin/bash
.
./yourscript.extension
, for example,./helloworld.py
or./helloworld.sh
, it will look for the interpreter at that top line, which would be#!/bin/python
or!#/bin/bash
, whereas when executing the script likepython helloworld.py
, the first line will not be observed because it is commented out. So it is a special sequence for the shell/kernel. – Tartuffe