How does /usr/bin/env work in a Linux shebang line?
env
is the name of a Unix program. If you read the manual (man env
) you can see that one way to use it is env COMMAND
, where in your case, COMMAND
is python3
.
According to the manual, this will
Set each NAME to VALUE in the environment and run COMMAND.
Running env
alone will show you what NAMEs and VALUEs are set:
$ env
TERM=xterm-256color
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin
…
Therefore, /usr/bin/env python3
is an instruction to set the PATH
(as well as all the other NAME+VALUE pairs), and then run python3
, using the first directory in the PATH
that contains the python3
executable.
Newer *nix versions will resolve this the same way as the command which
works.
It looks in all directories which are set in the environmental variable $PATH, whereever it is set (global, in your .bashrc or other logon script or by hand), one by one and returns the first match.
Important is, that some linux versions create alias files (aka symlinks), e.g. debian.
Another note: the bash command alias overrides this behavior as it is performed first.