Shell script shebang for unknown path
Question
Is it possible to specify a shebang line without knowing the path of the program you want to do the executing?
maybe don't specify the path
#!node
or specify several options
#!/usr/local/bin/node
#!/usr/bin/node
Extra points for cross platform solution (various flavors of linux, BSD, OSX etc...)
Solution
/usr/bin/env
is specifically thought of for cross-platform solutions.
env executes utility after modifying the environment as specified on
the command line. The option name=value specifies an environmental
variable, name, with a value of value. The option `-i' causes env
to completely ignore the environment it inherits.
If no utility is specified, env prints out the names and values of
the variables in the environment, with one name=value pair per line.
so something in lines of:
#!/usr/bin/env node
Will be cross-platform and "the right way to go".
OTHER TIPS
Contrary to what people may think there is not standard location for env
so we can only grab some info regarding it's location:
/usr/bin/env
- MacOS (10.12)- both
/bin/env
,/usr/bin/env
- Fedora (25)
I am sure others will be able to extend the list.
Put a space after the shebang. If the program is in environment variable PATH, it should go.
#! perl
Of course, a special case for Perl would be
:
eval 'exec perl -S $0 ${1+"$@"}'
if 0;
This works on unix and OSX, even when there is no /usr/bin/env as noted by @Jens
Dont use shebang.
node <<eof
your node program here
eof