2012-04-08 22 views
12

Quiero entender cómo funciona este script Scala:¿Cuál es el significado de! # (Bang-pound) en un script sh/Bash shell?

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

En la línea 3, lo que es "#!" Hacer? ¿Se alimenta el resto del archivo al standard input del programa Scala? Además, ¿está '! #' Documentado en cualquier lugar?

NB: Lo más cercano que pude encontrar, aunque no es directamente relevante de ninguna manera es el desbordamiento de pila pregunta Why do you need to put #!/bin/bash at the beginning of a script file? (sobre el inicio de una secuencia de comandos Bash).

+2

Versión de Windows de esta pregunta: http://stackoverflow.com/questions/6671913/scala-scripts-in-windows-batch-files –

Respuesta

18

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

Así que el código siguiente es sólo una cabecera para un guión Scala:

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

Nice. Entonces, ¿qué ocurre con el contenido del script que sigue al "! #"? –

+4

Scala lo ejecuta. El comando 'exec' hace que el intérprete' scala' * reemplace * el shell, por lo que bash nunca ve la línea '! #'. Y 'scala' ignorará todo entre e incluyendo el' #! 'Y'! # '. – cHao

+0

Pensé que así era como podría haber funcionado, pero no pude encontrar los documentos para eso en ninguna parte. ¡Gracias! –

2

Cuando quité !# en el programa de ejemplo en BluesRockAddict's answer, me sale el siguiente error en la consola:

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

Desde t lo anterior mensaje de error, que comprendía las siguientes cosas:

  1. !# es la etiqueta de cierre para la cabecera exec scala "$0" "[email protected]", lo que probablemente indica Scala que todo lo que viene después !# es el código Scala para ser ejecutado.
  2. !# se puede reemplazar con ::!#.
2

basado puramente en la experimentación (supongo que esto se describe en algún lugar): (#)

A partir de la Scala 2.10.0, el no estándar (desde un POV POSIX scripting) libras-bang no es una más tiempo requerido (o permitido) en un entorno de shell POSIX. La siguiente línea funciona (pero debe ser la primera línea del script, sin espacios iniciales):

#!/usr/bin/env scala 

Sin embargo, la única manera de proporcionar un tinglado en un archivo de Windows por lotes es engañar en llamar Scala consigo mismo como primer argumento. En consecuencia, Scala necesita saber dónde está la última línea del archivo por lotes y, por lo tanto, requiere la línea closing ::! #. Aquí hay un ejemplo de trabajo:

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

Corrección: Al principio tuve # scalav/usr/bin/env (nótese la posterior v), que es mi secuencia de comandos para definir la propiedad "scala.script", añadir algunas bibliotecas para! el classpath, antes de 'exec scala' en sí mismo. De esta forma, es posible determinar el nombre del script que se está ejecutando, aunque scalav debe estar en su PATH.

Cuestiones relacionadas