Möglichkeiten, ein Scala-Skript unter Linux eigenständig zu machen?

Möglichkeiten, ein Scala-Skript unter Linux eigenständig zu machen?

Scala-Programmierungsagt:

Das Aufrufen von Skripten mit Scala ist mühsam, wenn Sie diese Skripte häufig verwenden. Auf Windows- und Unix-ähnlichen Systemen können Sie eigenständige Scala-Skripte erstellen, bei denen Sie den Scala-Skriptdateinamen-Aufruf nicht verwenden müssen. Für Unix-ähnliche Systeme zeigt das folgende Beispiel, wie Sie ein ausführbares Skript erstellen. Denken Sie daran, dass Sie die Berechtigungen ausführbar machen müssen, z. B. 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

So können Sie es verwenden:

$ secho Hello World
You entered: Hello World

Ich habe mich gefragt, was es bedeutet

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

In sh?

Kann ich ein Scala-Skript eigenständig machen als

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

unter Linux?

Danke!

Antwort1

In sh,

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

ist ein Kommentar, ignoriert;

exec scala "$0" "$@"

bewirkt, dass der aktuelle Prozess sich selbst durch ersetzt scalaund alle Shell-Parameter als Argumente verwendet;

!#

hat keine Wirkung, da die Shell an dieser Stelle das Lesen des Skripts beendet hat.

Scala behandelt Skriptdateien jedoch, indem es einen „Header“ am Anfang der Datei ignoriert; dieser Header beginnt in einer Zeile, die mit #!(oder ::#!unter Windows) beginnt und endet mit einer Zeilepassend entweder !#( ::!#) oder/env. Die Kopfzeile kann eine einzelne Zeile sein, sodass beide

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

Und

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

Arbeit (letzteres erfordert, scaladass es auf dem ist PATH). Letzteres entsprichtdie Dokumentation.

( !#ist die symmetrische Version von #!und wird in Scala verwendet, um den von geöffneten „Header“ #!auf ähnliche Weise wie /*für */Kommentare in C zu schließen.)

verwandte Informationen