What is the purpose of using #!/usr/bin/env <sh|bash|python>
shebang compared to #!/bin/bash
, #!/bin/sh
or #!/usr/bin/python
?
2 Answers
Some people might use a different python (perl, etc.) than the system one. /usr/bin/env python
would run the version configured as the current one, possibly making the script more portable.
On the other hand, reportedly, some systems do not have /usr/bin/env
. Also, you cannot use #!/usr/bin/env foo x
as a replacement for #!foo x
, because foo x
will be interpreted as a single argument. So the value of the approach is debatable.
-
1Configured where? From
info coreutils 'env invocation'
I can see this form of calling makes sure it is external binary instead of shell built-in, but no indication howenv python
would be any different frompython
?– TuminoidJan 24, 2013 at 9:15 -
4Your
PATH
probably includes/usr/local/bin
first. If somebody has manually installed python there, thenenv
will call it, whereas#!/usr/bin/python
will bypass it. Jan 24, 2013 at 9:44 -
2
virtualenv
is a quite popular tool, and it installs a python executable in the working directory. You would need theenv
trick to get it to work correctly.– FlimmJan 29, 2013 at 21:38 -
2@Tuminoid: you are right:
env python
is the same aspython
. However the problem is that you can't write a shebang like#!python
: you need to specify a full path. Jan 29, 2013 at 22:36