Linux で Scala スクリプトをスタンドアロンにする方法はありますか?

Linux で Scala スクリプトをスタンドアロンにする方法はありますか?

Scalaプログラミング言う:

scala でスクリプトを呼び出すのは、頻繁に使用する場合には面倒です。Windows および Unix 系システムでは、scala スクリプト ファイル名呼び出しを使用する必要のないスタンドアロンの Scala スクリプトを作成できます。Unix 系システムの場合、次の例は実行可能スクリプトを作成する方法を示しています。権限を実行可能にする必要があることに注意してください (例: 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

使用方法は次のとおりです。

$ secho Hello World
You entered: Hello World

私はそれが何を意味するのか疑問に思いました

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

sh

Scalaスクリプトをスタンドアロンとして作成できますか?

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

Linux では?

ありがとう!

答え1

sh

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

コメントなので無視されます。

exec scala "$0" "$@"

現在のプロセスを に置き換えscala、すべてのシェルパラメータを引数として指定します。

!#

この時点でシェルはスクリプトの読み取りを停止しているため、効果はありません。

#!しかし、Scalaはスクリプトファイルを、ファイルの先頭にある「ヘッダー」を無視して処理します。そのヘッダーは、 (またはWindowsの場合)で始まる行で始まり::#!、行で終わります。!#::!#)または/envヘッダーは1行で済むので、

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

そして

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

仕事(後者はscala上にあることが必要ですPATH)。後者はドキュメント

(!#は の対称であり#!、Scala では によって開かれた「ヘッダー」を閉じるために使用されます。これは、C のコメントのおよび#!に似た方法です。)/**/

関連情報