2012-04-08 19 views
12

chcę zrozumieć, jak działa ten skrypt Scala:Jakie jest znaczenie! # (Bang-pound) w skrypcie powłoki sh/Bash?

#!/usr/bin/env bash 
exec scala "$0" "[email protected]" 
!# 
object HelloWorld { 
    def main(args: Array[String]) { 
     println("Hello, world! " + args.toList) 
    } 
} 
HelloWorld main args 

W linii 3, co jest "#!" Robi? Czy pozostała część pliku jest następnie przesyłana do standard input programu Scala? Co więcej, dokumentacja "! #" Jest udokumentowana w dowolnym miejscu?

NB: Najbliższy rzeczą mogę znaleźć, choć nie jest bezpośrednio związane w jakikolwiek sposób jest przepełnienie stosu pytanie Why do you need to put #!/bin/bash at the beginning of a script file? (około początku Bash skryptu).

+2

Wersja Windows tego pytania: http://stackoverflow.com/questions/6671913/scala-scripts-in-windows-batch-files –

Odpowiedz

18

Od the original documentation:

Script files may have an optional header that is ignored if present. There are two ways to format the header: either beginning with #! and ending with !#, or beginning with ::#! and ending with ::!#.

więc następujący kod jest tylko nagłówek dla skryptu Scala:

#!/usr/bin/env bash 
exec scala "$0" "[email protected]" 
!# 
+0

Nice. Co się dzieje z zawartością skryptu po "! #"? –

+4

Scala uruchamia to. Wbudowany 'exec' powoduje, że interpreter' scala' * zastępuje * powłokę, więc bash nigdy nie widzi linii '! # '. I 'scala' zignoruje wszystko pomiędzy i włączając' #! 'I'! # '. – cHao

+0

Myślałem, że tak mogło działać, ale nigdzie nie mogłem znaleźć dokumentacji. Dziękuję Ci! –

2

Kiedy usunąłem !# w programie próbki w BluesRockAddict's answer, pojawia się następujący komunikat o błędzie na konsoli:

error: script file does not close its header with !# or ::!# one error found

Od t że powyższy komunikat o błędzie, zrozumiałem następujące rzeczy:

  1. !# jest ścisła tag nagłówka exec scala "$0" "[email protected]", które prawdopodobnie mówi Scala, że ​​cokolwiek jest po !# jest kod Scala być wykonywany.
  2. !# może być zastąpiony przez ::!#.
2

wyłącznie w oparciu o eksperymenty (zakładam to opisane gdzieś) (#!)

Począwszy Scala 2.10.0, nie-standardowe (z POV POSIX skryptowego) funt-Bang ma dłużej wymagane (lub dozwolone) w środowisku powłoki POSIX. działa po jednej linii (ale musi być w pierwszej linii skryptu, bez spacje):

#!/usr/bin/env scala 

Jednak jedynym sposobem, aby zapewnić shebang w pliku okna wsadowego jest nakłonić go do wywoływania Scala z samym sobą jako pierwszym argumentem. W związku z tym program Scala musi wiedzieć, gdzie znajduje się ostatnia linia pliku wsadowego, dlatego wymaga linii closing ::! #. Oto przykład praca:

::#! 
call scala %0 %* 
goto :eof 
::!# 

Korekta: I pierwotnie miał # scalav/usr/bin/env (zawiadomienie tylną V), który jest mój skrypt, aby określić właściwość "scala.script", dodać kilka bibliotek! Ścieżka klas przed samym exec scala. W ten sposób można określić nazwę skryptu, który jest wykonywany, chociaż skalav musi wtedy być w twojej PATH.