#!は/ usr / binに/ ...ファイルの先頭には何を意味するのでしょうか?

StackOverflow https://stackoverflow.com/questions/1122778

  •  13-09-2019
  •  | 
  •  

質問

私はHaskellでこのような何かを行うことができます:

#!/usr/bin/runghc
main=putStrLn "Hello World"

その後、私は./hello.hsでそれを実行することができます。

私の質問は、なぜ最初の行は無視されていますか? Haskellではコメントは--で始まるが、最初の行はまだ無視しているようです。それGHCiの中にもロードされます。トリックはまた、PythonとPerlのと連動しています。

しかし、私はJavaで似た何かをするときます:

#!/usr/local/jdk1.6.0_13/bin/javac
...

javacは私のコンパイラエラーを与えます。

それでは、どのようにこの作業を行い、どのように私はそれは、Javaで動作するようになるだろう?

感謝します。

役に立ちましたか?

解決

#! 「シェバングの」名前を付けてスクリプトを実行するUnixの方法です。あなたがファイルを実行するためにOSを依頼する場合、これは通常の.exeファイル、および#ではないことを把握します!開始時 #の後にコマンドを実行するためにOSに指示する魔法のマーカーとして機能します!ので、このファイルは

そのコマンドの引数となり、コマンドや配線アップ

myfile.pyが含まれている場合は、

#!/usr/bin/python

ファイルは、

を実行しているとは非常に異なっていないことを実行します
$ /usr/bin/python myfile.py

私のHaskellの知識は貧弱です。しかし、あなたの特定のケースのためにそれはrunghcコマンドです 単に、最初の行を読み取る#で指定された引数を解析!ラインは、(取り除か最初の先取特権を持っているであろう - 詳細はGHCのソースでrunghc.hsを参照してください。)一時ファイルにファイルの残りの部分を書き込み、その一時ファイル上でGHCを実行します。

あなたはjavacのと同じことをやってみたかった場合はrunghcと同じアプローチを使用することができます。 、ファイルの最初の行を食べる一時ファイルにファイルの残りの部分を書き込み、そのファイル上のjavacを実行するラッパーを、書きます。

他のヒント

"は/ usr / binに/ runghc#!" あなたのファイルがhello.hsで、最初の行がある場合は、シェルが実行されます:

/usr/bin/runghc hello.hs

が最初の行には、基本的にスクリプトを実行するために使用するためにどのようなシェルを伝えます。

Javaの例については、最初の行はを実行する必要があります。の走るをスクリプトではないが、のスクリプトをコンパイルします。

  

私の質問は、なぜ最初の行は無視されていますか? Haskellではコメントで始まる - しかし、最初の行はまだ無視しているようです。それGHCiの中にもロードされます。トリックはまた、PythonとPerlのと連動しています。

#は、これらの言語でコメントを開始しますので、インタプリタはコメントとしてその行を見て、それを無視するため、「トリック」はPythonとPerlで動作します。だから、彼らのために、それは特別な何もない。

Haskellでは、#は、コメントを開始しませんので、それが正常に動作しないでしょう。しかし、GHC(メモリが機能する場合は、おそらく、他の実装では、抱擁もそれをした)シェバング線のための特別なケースを有しています。ファイルの最初の行は#!で始まる場合、それはコメントとして扱われます。言語仕様からのこの偏差は作るために正確に組み込まれています。

$ chmod +x hello.hs
$ ./hello.hs

作品。シェバング行のためにそれに組み込まれた特別なケースがありませんので、それはjavacでは動作しません。

唯一のインタープリタ言語で動作しますシェバングは....それは一般的に、ほとんどの場合にエラー出力をコンパイラに何を意味する

PythonやPerlの、と明らかにハスケルは、すべての言語を解釈されるので、

これが動作することを理由があります。これは、スクリプトを実行しますインタプリタを指定するための標準的なUnixの方法です。 Javaはコンパイル言語であり、インタプリタで実行することはできません。

のjavacコンパイラ、ないインタプリタです。

これは、私が「魔法」を引き起こしているものであると信じて対話モードを欠いています。 それは、同じ機能を欠いので、同じことがGCCでは動作しません。

DMD(Dコンパイラ)例えば、interpertationは、対話的な編集(#!は/ usr / binに/ DMD -run)のこの種を持ってサポートしているコンパイラの一例です。

それはあなたのスクリプトを解釈するために、コンピュータ上で実行可能ファイルの場所です。 Javaはコンパイル言語である、したがって、このような文は必要ありません。

#は法的なコメントマーカーではないとして、

また、ポイントは、それが特別なコメントであるということです、Javaで構築はそのようでは合法ではないでしょう。そのような建設は理にかなっている場合...それはない...それは次のようになります:

//!/usr/local/jdk1.6.0_13/bin/javac

が見つかりシェバング線に対するこの参照 ウィキペディアのが、<のhref = "HTTP経由://en.wikipedia .ORG /ウィキ/ Interpreter_directive」relが= "nofollowをnoreferrerは">このには方が良いようです記事に。 noreferrer">も

scroll top