Maneiras de tornar um script Scala independente no Linux?

Maneiras de tornar um script Scala independente no Linux?

Programação Scaladiz:

Invocar scripts com scala é entediante quando você usa esses scripts com frequência. Em sistemas Windows e do tipo Unix, você pode criar scripts Scala independentes que não exigem o uso da invocação de nome de arquivo de script scala. Para sistemas do tipo Unix, o exemplo a seguir demonstra como criar um script executável. Lembre-se de que você precisa tornar as permissões executáveis, por exemplo, 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

Aqui está como você pode usá-lo:

$ secho Hello World
You entered: Hello World

Fiquei me perguntando o que significa

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

em sh?

Posso criar um script Scala independente como

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

no Linux?

Obrigado!

Responder1

Em sh,

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

é um comentário ignorado;

exec scala "$0" "$@"

faz com que o processo atual seja substituído por scalae todos os parâmetros do shell como argumentos;

!#

não tem efeito porque o shell parou de ler o script neste ponto.

No entanto, Scala lida com arquivos de script ignorando um “cabeçalho” no início do arquivo; esse cabeçalho começa em uma linha que começa com #!(ou ::#!no Windows) e termina com uma linhacorrespondendo a !#( ::!#) ou/env. O cabeçalho pode ser uma única linha, então ambos

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

e

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

trabalho (este último exige scalaestar no PATH). Este último corresponde aa documentação.

( !#é simétrico de #!e é usado em Scala para fechar o “cabeçalho” aberto por #!, de maneira semelhante a /*e */para comentários em C.)

informação relacionada