2012-04-08 12 views
12

Voglio capire come funziona questo script Scala:Qual è il significato di! # (Bang-pound) in uno script di shell 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 

sulla linea 3, ciò che è "#!" Fare? Il resto del file viene quindi inviato a standard input del programma Scala? Inoltre, è "! #" Documentato ovunque?

NB: La cosa più vicina che ho trovato, anche se non è direttamente rilevante in qualsiasi modo è Stack Overflow questione Why do you need to put #!/bin/bash at the beginning of a script file? (circa l'inizio di uno script Bash).

+2

Versione Windows di questa domanda: http://stackoverflow.com/questions/6671913/scala-scripts-in-windows-batch-files –

risposta

18

Da 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 ::!#.

Quindi il codice che segue è solo un colpo di testa per uno script Scala:

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

Nice. Quindi cosa succede con il contenuto della sceneggiatura che segue "! #"? –

+4

Scala lo esegue. Il builtin 'exec' fa in modo che l'interprete' scala' * sostituisca * la shell, quindi bash non vede mai la riga '! #'. E 'scala' ignorerà tutto tra e incluso' #! 'E'! # '. – cHao

+0

Ho pensato che avrebbe funzionato, ma non sono riuscito a trovare i documenti ovunque. Grazie! –

2

Quando ho tolto !# nel programma di esempio in BluesRockAddict's answer, ottengo il seguente errore alla console:

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

da t egli sopra messaggio di errore, ho capito le seguenti cose:

  1. !# è il tag di chiusura per l'intestazione exec scala "$0" "[email protected]", che probabilmente dice Scala che tutto ciò che viene dopo !# è il codice Scala da eseguire.
  2. !# può essere sostituito con ::!#.
2

basata esclusivamente sulla sperimentazione (Presumo che ciò è descritto da qualche parte): (! #)

A partire dalla Scala 2.10.0, la non-standard (da un POV POSIX scripting) pound-bang c'è più richiesto (o permesso) in un ambiente di shell POSIX. La seguente linea singolo funziona (ma deve essere la prima riga dello script, senza spazi iniziali):

#!/usr/bin/env scala 

Tuttavia, l'unico modo per fornire uno shebang in un file di finestre batch è di ingannare in chiamando Scala con se stesso come primo argomento. Di conseguenza, Scala ha bisogno di sapere dove si trova l'ultima riga del file batch e quindi richiede la riga di chiusura ::! #. Ecco un esempio di lavoro:

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

Correzione: Inizialmente avevo #/usr/bin/env scalav (notare il finale v), che è il mio script per definire la proprietà "scala.script", aggiungere alcune librerie a! il classpath, prima di 'exec scala' stesso. In questo modo è possibile determinare il nome dello script che viene eseguito, anche se lo scalav deve essere nel PATH.