15

このScalaスクリプトがどのように機能するかを理解したい:

#!/usr/bin/env bash
exec scala "$0" "$@"
!#
object HelloWorld {
    def main(args: Array[String]) {
        println("Hello, world! " + args.toList)
    }   
}
HelloWorld main args

3行目で、「!#」は何をしていますか?その後、ファイルの残りの部分はScalaプログラムの標準入力に送られますか?また、「!#」はどこかに文書化されていますか?

注意:私が見つけた最も近いものは、直接関係はありませんが、Stack Overflowの質問です。なぜスクリプトファイルの先頭に#!/ bin / bashを置く必要があるのですか?( Bashスクリプトの開始について)。

4

3 に答える 3

18

元のドキュメントから:

スクリプトファイルには、存在する場合は無視されるオプションのヘッダーが含まれる場合があります。ヘッダーをフォーマットするには、2つの方法があります。#で始まる方法です。!#で終わるか、::#!で始まります。::!#で終わります。

したがって、次のコードはScalaスクリプトの単なるヘッダーです。

#!/usr/bin/env bash
exec scala "$0" "$@"
!#
于 2012-04-08T04:48:04.580 に答える
2

BluesRockAddictの回答!#のサンプルプログラムで削除すると、コンソールで次のエラーが発生します。

エラー:スクリプトファイルは!#または::!#でヘッダーを閉じません1つのエラーが見つかりました

上記のエラーメッセージから、私は次のことを理解しました。

  1. !#はヘッダーの終了タグですexec scala "$0" "$@"。これはおそらく、後に続くものはすべて!#実行されるScalaコードであることをScalaに伝えます。
  2. !#に置き換えることができます::!#
于 2012-04-08T06:20:15.903 に答える
2

純粋に実験に基づいています(これはどこかで説明されていると思います):

Scala 2.10.0以降、POSIXシェル環境では非標準(POSIXスクリプトPOVから)のポンドバン(!#)は不要になりました。次の1行が機能します(ただし、先頭にスペースを入れずに、スクリプトの最初の行にする必要があります)。

#!/usr/bin/env scala

ただし、Windowsバッチファイルでシバンを提供する唯一の方法は、それをだまして、最初の引数としてそれ自体を使用してScalaを呼び出すことです。したがって、Scalaはバッチファイルの最後の行がどこにあるかを知る必要があるため、::!#行を閉じる必要があります。実例は次のとおりです。

::#!
call scala %0 %*
goto :eof
::!#

訂正:私はもともと#!/ usr / bin / env scalav(末尾のvに注意)を持っていました。これは、プロパティ「scala.script」を定義するスクリプトであり、「execscala」自体の前にいくつかのライブラリをクラスパスに追加します。そうすれば、実行されているスクリプトの名前を判別できますが、scalavはPATHに含まれている必要があります。

于 2013-02-13T19:40:14.097 に答える