Программирование на 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.)