2012-04-17 3 views
11

私は両方見てきました:Perl:Shebang(スペース?) "#!"

#!/path/... 
#! /path/... 

権利は何ですか?それは問題ですか?歴史はありますか?

古代版のUnixではスペースが必要ではないと聞いたことがあります。しかし、それはちょうど噂だったと聞きました。誰かが確かに知っていますか?


編集:が、私はこれを依頼する場所をより良いとは思いませんでした。私が知っている限り、スペースはプログラムを異なる方法で動作させることができるので、プログラミングに関連しています。それで私はここでそれに尋ねました。

+0

あなたは両方との両方の仕事を見てきた場合、それは好みの問題だということを理由に立っ/美的。 –

+2

私はこれがどのようにプログラミングに関係しているのか分かりません。 – ergosys

+0

@JustinPearce:これは安全な仮定ではありません。 '#!'の後ろにスペースを許さないシステムもあるかもしれません。これはスペースのないバージョンを移植性の高いものにします。しかし、明らかになったように、すべてのシステムでブランクが許可されている可能性があります。詳細は私の答えを見てください。 –

答えて

17

私はまた、いくつかの古いUnixライクなシステムでは空白が許されていないという曖昧な記憶を持っていますが、少しの研究ではそれをサポートしていません。 this Wikipedia articleによると、#!構文は1月にバージョン8のUnixで導入されました

は、この機能の1980年デニス・リッチーの最初の発表は言う:ように実行されているファイルが始まる場合

システムが変更されました 魔法のキャラクター#!行の残りの部分は、実行されたファイルのためのインタプリタの名前であると理解されます。 以前は(実際には )シェルはこの仕事の多くを行っていました。テキスト のファイル名がコマンドとして入力されたときに自動的に が実行可能モードのテキストファイルで実行されました。施設を システムに入れると、次のような利点があります。

この素晴らしい機会を活用するために[SNIP]

は、あなたのシェルスクリプトの最初の行の左端に

#! /bin/sh 

を置きます。ブランク !大丈夫です。完全なパス名を使用します(検索は行われません)。 の時点では、行全体が16文字に制限されていますが、この制限は になります。

これは、いくつかの後にUnixライクなシステムは#!構文をサポートしますが!後に空白を許可していませんでしたが、非常に最初の実装は、明示的に許可されていることのブランクを与え、そう思われることを考えます。

leonbloyの答えは、より多くの文脈を提供します。

UPDATE:

Perlインタープリタ自体も、それはカーネルによって認識されないのシステム上、#!で始まる行を認識します。詳細については、perldoc perlrunを実行するか、this web pageを参照してください。

#!ラインは常に であるため、スイッチについて検査されます。したがって、1つの引数だけを許可するマシンにいる場合は、#!と を付けてください。ラインを悪くしたり、悪いことに、#! は、-xがプログラムの先頭を見つけるために使用されたとしても、Perlがどのように呼び出されたかにかかわらず、一貫したスイッチ動作を得ることができます。

Perlは、#!の後に空白も許可します。

(個人的に、私は空白のない#!行を書くことを好むが、それはどちらかのように動作します。)

+0

私の理解を広げる機会をありがとう、キース。私のシェルフーはそれほど良いものではないので、私の限られた経験で私の前提が作られました。毎日何か新しいことを学ぶ。 :D –

9

通常両方の方法で動作するようです。 See here。私はスペースのないバージョンが今日よりはるかに一般的であり、私にはもっと魅力的であると言いたい。

ところで、これは特にPerlには関係しません(ただし、プログラミングには間違いありません)。

+1

そのリンクは非常に驚くほど研究されているので、+1はあなたに擦り傷がつきます:) – ikegami