Шебанг и Groovy

Можно ли объявить в начале файла, что он должен быть выполнен как Groovy script?

Примеры для других языков сценариев:

#!/bin/sh
#!/usr/bin/python
#!/usr/bin/perl

Ответы

Ответ 1

Этот #!/usr/bin/env groovy
будет искать ваш путь в поисках groovy для выполнения script

Ответ 2

В соответствии с this вы можете использовать #!/usr/bin/groovy (если это его местоположение). Поисковый запрос, который вы ищете, это shebang (это то, что называется первой строкой).

Ответ 3

Общим трюком является запись script, имеющая смысл на нескольких языках, также известный как "полиглот" script.

В случае Bash и Groovy это особенно удобно:

#!/bin/sh
//bin/true; exec groovy -cp .. "$0"

println "Hello from Groovy"
  • Первая строка - это shebang (#!), которая сообщает ОС, чтобы запустить script как обычную оболочку script.
  • Вторая строка, когда выполняется оболочкой, вызывает команду /bin/true (no-op); затем находит исполняемый файл groovy в PATH и запускает его непосредственно в файле script ("$0") плюс дополнительные аргументы, заменяя текущий процесс оболочки (exec)
  • Groovy будет игнорировать первую строку, потому что это shebang; он будет игнорировать вторую строку, потому что это комментарий (//) и будет запускать оставшуюся часть script.

Если вам нужна более сложная часть оболочки, возможно, для настройки переменных среды или обнаружения, где установлен groovy, вы можете использовать другой трюк:

#!/bin/sh
'''':
echo Hello from Shell
exec groovy -cp .. "$0"
'''

println "Hello from Groovy"
  • Опять же, shebang сигнализирует ОС, чтобы начать выполнение этих файлов в виде оболочки script.
  • Оболочка анализирует '''': как две пустые строки '', за которыми следует двоеточие, которое не является оператором.
  • Оболочка будет выполнять оставшуюся часть файла, по очереди, пока не найдет exec или exit
  • Если все в порядке, оболочка будет запускать команду groovy в самом файле script ("$0")
  • Groovy пропустит строку shebang, затем проверит '''': как начало длинной строки ''', тем самым пропустив все команды оболочки, а затем запустим оставшуюся часть script.