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 scala
und 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, scala
dass 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.)