2015-05-01 1 views
10

Скала документация показывает, что способ создать SCALA сценарий, как это (#!):Почему Scala используют перевернутую хижину вместо того, чтобы просто заходящего переводчика Скале

#!/bin/sh 
exec scala "$0" "[email protected]" 
!# 
/* Script here */ 

Я знаю, что это выполняет Scala с именем файла сценария и переданными ему аргументами, и что команда scala, по-видимому, знает, как читать файл, который начинается следующим образом, и игнорировать все до обратного shebang !#

Мой вопрос: есть ли какая-либо причина почему я должен использовать этот (довольно подробный) формат для скрипта scala, а не просто:

#!/bin/env scala 
/* Script here */ 

Это, насколько я могу судить по быстрому тесту, делает то же самое, но менее многословно.

+0

Единственное, что я получил, это, очевидно, более гибкий и позволяет устанавливать переменные среды (например, '_JAVA_OPTIONS') до запуска скрипта. –

ответ

3

Сколько лет в документации? Обычно такая вещь (часто называемая «exec hack») была рекомендована до того, как /bin/env был распространен, и это был лучший способ получить функциональность. Обратите внимание, что /usr/bin/env чаще встречается, чем /bin/env, и его следует использовать вместо этого.

+0

Это как в старой документации, так и в текущей документации. http://www.scala-lang.org/documentation/getting-started.html – zstewart

+2

К тому времени, когда была изобретена Scala, '/ usr/bin/env' (это'/usr/bin/env', а не '/ bin/env') прочно утвердились уже более десяти лет, и я сомневаюсь, что есть платформа, на которой работают Scala и shebang, но не '/ usr/bin/env'. – Gilles

+0

@ Giles '/ bin/env' достаточно распространен (действительно, хотя Linux стандартизован'/usr/bin/env', в Red Hat '/ usr/bin/env' является символической ссылкой на'/bin/env' , или, по крайней мере, был последний раз, когда я смотрел), но поскольку OP упоминает '/ bin/env', бессмысленно говорить о'/usr/bin/env'. –

1

Отметьте, что это /usr/bin/env, а не /bin/env.

Нет преимуществ при использовании промежуточной оболочки вместо /usr/bin/env, за исключением работы в некоторых редких античных вариантах Unix, где env не находится в /usr/bin. Ну, технически SCO все еще существует, но Scala даже работает там?

Однако преимущество варианта оболочки является то, что он дает возможность настраивать то, что выполняется, например, для добавления элементов в PATH или CLASSPATH, или добавить опции, такие как -savecompiled к переводчику (как показано в manual) , Возможно, поэтому документация предлагает форму оболочки.

Я не в команде разработчиков Scala, и я не знаю, какова историческая мотивация документации Scala.

+0

Педанти, в котором находится bin env, не имеет отношения к вопросу, так как некоторые системы конфигурируют их 'bin' по-разному, и этот вопрос не об этом. Полезна информация о другой конфигурации, которая может быть сделана в специализированном варианте. – zstewart

0

Scala не всегда поддерживает /usr/bin/env. Никакой конкретной причины для этого, просто, я думаю, человек, который написал поддержку сценариев оболочки, не был знаком с этим синтаксисом еще в середине 00-х. Документация соответствовала тому, что было поддержано, и я добавил поддержку /usr/bin/env в какой-то момент (iirc), но так и не потрудился сменить документацию.

Смежные вопросы