2015-10-29 5 views
10

私はshebang #!をしばらく使っていますが、今日は私を混乱させるユースケースに出くわしました。Shebang "#!" "!#"は終了しますか?

#!/usr/bin/env scala 
println("hello world") 

のようなScalaのスクリプトを実行するにはいくつかの方法が、このソリューションは、基本的に第1のbashを起動するようにしかし、私はシェバング

#!/bin/sh 
exec scala "$0" "[email protected]" 
!# 
println("hello world") 

のこのバージョンに出くわした実行exec scala "$0" "[email protected]"、ルックスがあります$0は現在のファイル名を表し、[email protected]は位置指定配列の引数です。

私の質問それはそれが出てエラーではありませんでしたが、どちらも「そうそう」STDOUTで、誰でもに説明することができ、私に与えた

#!/bin/sh 
exec scala "$0" "[email protected]" 
echo "oh Yeah" 
!# 
println("hello world") 

bashで実行することができ#!!#間のすべてのものを、どういう意味です私はここで何が起こっているのですか?


更新:!#はScalaのことですが実現した後、私はスカラ座のソースコードをダウンロードし、それが唯一のレックス・スプーンによって書かれScriptRunner.scala一部のコメントに表示されます実現。

+3

'exec'は、現在のプロセスを新しいプロセスで置き換えます。実行後は何もない。 –

+0

@EtanReisnerの場合、新しいインタプリタ(スカラインタプリタ)は 'println()'から開始し、 'echo'ではなく、'!# 'がどこに使われているのでしょうか? –

+0

つまり、 'exec'の前に置かれていると' echo'を表示させることができます。Perlは、['perldoc perlrun'](http://perldoc.perl.org/perlrun.html)にいくつかの関連する表記法を文書化しています。 –

答えて

9

!#行の意味はありませんからシェルです。

#!/bin/sh行は、スクリプトが/bin/shで実行されていることを示します。 exec scala "$0" "[email protected]"行は、scalaを呼び出し、scalaコマンドにスクリプトの名前とその引数を渡します。 execが返されないので、シェルは残りのスクリプトを表示しません。

Scalaについてはわかりませんが、Scalaインタプリタ自身が#!行から!#行までのすべてをコメントとして扱っていると私は推測しています。その後、Scalaステートメントprintln("hello world")で実行を開始します。

つまり、!#はシェル構文ではなくScala構文です(ただし、Scala構文はシェルスクリプトでこのように使用できるように設計されています)。

Scala Language Specificationを簡単に見てみると、これがどのように定義されているかはわかりません。それはthis questionに記載されていますが、説明されていません。 chepner 3のコメントが示唆するように、実際の言語構文の一部ではなく、Scalaインタプリタのハックだと思われます。

SOM-snyttはこのhereを実装Scalaのインタープリタのコードが見つかりました:

object ScriptSourceFile { 
    /** Length of the script header from the given content, if there is one. 
    * The header begins with "#!" or "::#!" and ends with a line starting 
    * with "!#" or "::!#". 
    */ 
... 

をしかし、私はそれが文書化されていますかどうかを疑問に思います。

+3

shebang自体はScalaのコメントではないので、インタプリタ自体のハッキングと思われます。 – chepner

+1

ここにあります:https://github.com/scala/scala/blob/2.11.x/src/reflect/scala/reflect/internal/util/SourceFile.scala#L71 –

+0

@ som-snytt:あなたは知っていますか?それが文書化されているかどうか? –

関連する問題