Adriano Ferreira said:
Hey, that's not fair. In your illustration above, does 'python' can be
found in the PATH? That is,
$ python /tmp/hello.py
works? If it does, probably
#!/usr/bin/python
#!/usr/bin/env python
#!python
would also work if
(1) 'python' is at '/usr/bin/python' (but that's inflexible)
(2) 'python' can be found in the environment variable path (if 'env'
is at '/usr/bin/env')
(3) 'python' can be found in the environment variable path (no need
for 'env' utility)
Contrary to popular belief, #! is not intended for the shell,
but rather for the execve(2) system call of the UNIX operating
system. These two characters form the 16 bit "magic number"
of interpreter files. Any executable file must start with a
16 bit field that identifies it so the operating system will
know how to execute it.
In the case of a #! interpreter file, the operating system
expects the rest of that line to be the path to the file.
PATH is not searched, and is irrelevant. The only way
#!python can work, is if it's in the current working directory.
Just to help make it confusing, when this mechanism fails
and execve(2) returns an error, most shells will go on to
try to execute the file themselves, regardless of whether
there's a #! or not. csh (the shell language that doesn't
look anything like C, Bill Joy's attempt at language design
before he started over with Java) does that only if the first
line is "#"; otherwise it invokes the Bourne shell.
Donn Cave, (e-mail address removed)