Я недавно написал патч для GNU Coreutils версии env
для решения этой проблемы:
http://lists.gnu.org/archive/html/coreutils/2017-05/msg00018.html
Если у вас есть это, вы можете сделать:
#!/usr/bin/env :lang:--foo:bar
env
разделит :lang:foo:--bar
на поля lang
, foo
и --bar
.Он будет искать PATH
для интерпретатора lang
, а затем вызывать его с аргументами --foo
, bar
, плюс путь к сценарию и аргументы этого сценария.
Существует также функция дляпередать имя сценария в середине вариантов.Предположим, вы хотите запустить lang -f <thecriptname> other-arg
, а затем остальные аргументы.С этим исправленным env
это делается следующим образом:
#!/usr/bin/env :lang:-f:{}:other-arg
Крайнее левое поле, эквивалентное {}
, заменяется следующим первым аргументом, который при вызове взрыва хеша являетсяимя сценарияЭтот аргумент затем удаляется.
Здесь other-arg
может быть чем-то, обработанным lang
, или, возможно, чем-то, обработанным скриптом.
Чтобы лучше понять, см. Многочисленный тест echo
случаи в патче.
Я выбрал символ :
, потому что это существующий разделитель, используемый в PATH
в системах POSIX.Поскольку env
выполняет поиск PATH
, маловероятно, что он будет использоваться для программы, имя которой содержит двоеточие.Маркер {}
происходит от утилиты find
, которая использует его для обозначения вставки пути в командную строку -exec
.