¿Formas de hacer que un script Scala sea independiente en Linux?

¿Formas de hacer que un script Scala sea independiente en Linux?

Programación escalaldice:

Invocar scripts con Scala es tedioso cuando se utilizan estos scripts con frecuencia. En sistemas Windows y Unix, puede crear scripts de Scala independientes que no requieren que utilice la invocación de nombre de archivo de script de Scala. Para sistemas tipo Unix, el siguiente ejemplo demuestra cómo crear un script ejecutable. Recuerda que tienes que hacer que los permisos sean ejecutables, por ejemplo, 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

Así es como puedes usarlo:

$ secho Hello World
You entered: Hello World

Me preguntaba qué significa

# src/main/scala/progscala2/toolslibs/secho
exec scala "$0" "$@"
!#

en sh?

¿Puedo hacer un script Scala independiente como

#!/path/to/scala
print("You entered: ")
args.toList foreach { s => printf("%s ", s) }
println

en linux?

¡Gracias!

Respuesta1

En sh,

# src/main/scala/progscala2/toolslibs/secho

es un comentario, ignorado;

exec scala "$0" "$@"

hace que el proceso actual se reemplace a sí mismo con scalay todos los parámetros del shell como argumentos;

!#

no tiene ningún efecto porque el shell ha dejado de leer el script en este punto.

Sin embargo, Scala maneja archivos de script ignorando un "encabezado" al comienzo del archivo; ese encabezado comienza en una línea que comienza con #!(o ::#!en Windows) y termina con una líneacoincidente con !#( ::!#) o/env. El encabezado puede ser una sola línea, por lo que ambos

#!/path/to/scala
!#
print("You entered: ")
args.toList foreach { s => printf("%s ", s) }
println

y

#!/usr/bin/env scala
print("You entered: ")
args.toList foreach { s => printf("%s ", s) }
println

trabajo (este último requiere scalaestar en el PATH). Este último corresponde ala documentación.

( !#es el simétrico de #!y se usa en Scala para cerrar el "encabezado" abierto por #!, de una manera similar a /*y */para los comentarios en C.)

información relacionada