Строка shebang никогда не указывается как часть POSIX, SUS, LSB или любой другой спецификации. AFAIK, это даже не было должным образом задокументировано.
Существует грубое согласие относительно того, что он делает: выбирайте все между !
и \n
и exec
it. Предполагается, что все между !
и \n
является полным абсолютным путем к интерпретатору. Нет единого мнения о том, что произойдет, если оно содержит пробелы.
- Некоторые операционные системы просто воспринимают все как путь. В конце концов, в большинстве операционных систем пробел или тире допустимы в пути.
- Некоторые операционные системы разделяются на пробелы и обрабатывают первую часть как путь к интерпретатору, а остальные - как отдельные аргументы.
- Некоторые операционные системы разделяются на первый пробел first и обрабатывают переднюю часть как путь к интерпретатору, а остальные - как аргумент single (это то, что вы видите).
- Некоторые даже не поддерживают линии Шебанга вообще .
К счастью, 1. и 4., кажется, вымерли, но 3. довольно широко распространен, поэтому вы просто не можете полагаться на возможность передать более одного аргумента.
И поскольку расположение команд также не указано в POSIX или SUS, вы обычно используете этот единственный аргумент, передавая имя исполняемого файла env
, чтобы it могло определить местоположение исполняемого файла; e.g.:
#!/usr/bin/env gawk
[Очевидно, что все еще предполагает определенный путь для env
, но существует лишь очень немного систем, где он живет в /bin
, так что это в целом безопасно. Расположение env
намного более стандартизировано, чем расположение gawk
или даже хуже, например python
или ruby
или spidermonkey
.]
Это означает, что вы не можете использовать любые аргументы вообще .