Как сделать скрипт Scala автономным в Linux?

Как сделать скрипт Scala автономным в Linux?

Программирование на Scalaговорит:

Вызов скриптов с помощью scala утомителен, если вы используете эти скрипты часто. В Windows и Unix-подобных системах вы можете создавать автономные скрипты Scala, которые не требуют использования вызова scala script-file-name. Для Unix-подобных систем следующий пример демонстрирует, как создать исполняемый скрипт. Помните, что вам нужно сделать разрешения исполняемыми, например, chmod +x secho:

#!/bin/sh
# src/main/scala/progscala2/toolslibs/secho
exec scala "$0" "$@"
!#
print("You entered: ")
args.toList foreach { s => printf("%s ", s) }
println

Вот как вы можете это использовать:

$ secho Hello World
You entered: Hello World

Мне было интересно, что это значит

# src/main/scala/progscala2/toolslibs/secho
exec scala "$0" "$@"
!#

в sh?

Могу ли я сделать скрипт Scala автономным как

#!/path/to/scala
print("You entered: ")
args.toList foreach { s => printf("%s ", s) }
println

на Linux?

Спасибо!

решение1

В sh,

# src/main/scala/progscala2/toolslibs/secho

это комментарий, игнорируется;

exec scala "$0" "$@"

заставляет текущий процесс заменить себя на scala, а все параметры оболочки — на аргументы;

!#

не имеет никакого эффекта, поскольку оболочка на этом этапе прекратила чтение скрипта.

Однако Scala обрабатывает файлы скриптов, игнорируя «заголовок» в начале файла; этот заголовок начинается со строки, начинающейся с #!(или ::#!в Windows) и заканчивается строкойсоответствующий либо !#( ::!#), либо/env. Заголовок может быть одной строкой, поэтому оба

#!/path/to/scala
!#
print("You entered: ")
args.toList foreach { s => printf("%s ", s) }
println

и

#!/usr/bin/env scala
print("You entered: ")
args.toList foreach { s => printf("%s ", s) }
println

работа (последнее требует scalaбыть на PATH). Последнее соответствуетдокументация.

( !#симметричен #!, и используется в Scala для закрытия «заголовка», открытого #!, аналогично /*и */для комментариев в C.)

Связанный контент