Shell script shebang для неизвестного пути

Можно ли указать строку shebang, не зная пути программы, которую вы хотите выполнить?

может не указывать путь

#!node

или укажите несколько параметров

#!/usr/local/bin/node
#!/usr/bin/node

Дополнительные точки для кросс-платформенного решения (различные варианты linux, BSD, OSX и т.д.)

Ответ 1

/usr/bin/env специально рассматривается для кросс-платформенных решений.

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.

поэтому что-то в строках:

#!/usr/bin/env node

Будет кросс-платформенный и "правильный путь".

Ответ 2

Вопреки тому, что люди думают, что для env нет стандартного местоположения, поэтому мы можем получить только некоторую информацию о его местоположении:

  • /usr/bin/env - MacOS (10.12)
  • оба /bin/env, /usr/bin/env - Fedora (25)

Я уверен, что другие смогут расширить список.

Ответ 3

Не используйте shebang.

node <<eof
your node program here
eof

Ответ 4

Поместите пробел после shebang. Если программа находится в переменной среды PATH, она должна идти.

#! perl

Конечно, особый случай для Perl был бы

:
eval 'exec perl -S $0 ${1+"[email protected]"}'
  if 0;

Это работает на unix и OSX, даже если нет /usr/bin/env, как отмечено @Jens