なぜ「彼女-bangが」で始まるない#!ように、#!/bin/bash?私はこれがどのように行われるかを常に受け入れていますが、その背後に理由はありますか?
なぜ#; 通常はコメントではありませんか?それともコメントとすべきなのか?
なぜ「彼女-bangが」で始まるない#!ように、#!/bin/bash?私はこれがどのように行われるかを常に受け入れていますが、その背後に理由はありますか?
なぜ#; 通常はコメントではありませんか?それともコメントとすべきなのか?
回答:
通常、シバンは単に#!(!「バング」と呼ばれ、「彼女」は「SHArp」または「haSH」のいずれかの破損であるように見えます)を指します#-行全体がシバン行と呼ばれます
処理方法がわからないものとの後方互換性のために、意図的にコメント文字で始まっています。これ!はおそらく、ファイルを開始するランダムなコメントと区別するためだけなので、で始まるファイル# this is my script!はthis is my script!インタープリターを実行しようとしません
!は、他のコンテキストで実行されるコマンドを示すためによく使用されます。たとえばvim、独自のコマンドラインを持つ他のプログラムでは、多くの場合、bangは内部インターフェイスではなくシステムシェルでコマンドを実行するためのエスケープ文字です。
これを理解するには、スクリプトの最初の行が2つの異なるプログラムによって実際に2回読み取られることを理解する必要があります。カーネルは最初にファイルを開き#!、最初の行でその文字シーケンス()を探します。見つかった場合は、そこに示されているシェルプログラムを実行し、ファイル名をパラメーターとして渡します。(たとえば、ファイル/home/me/fooがで始まる場合、#!/bin/shカーネルはを実行します/bin/sh /home/me/foo)。
次に、シェル(bin/shまたは指定されたインタプリタプログラム)がファイルを読み取ります。シェルはシバン行については何も認識していませんが、ファイル内の他の行と同じように最初の行を読み取ります。すべてを読み取ります。シェルがクラッシュしたり、その動作を変更したりしたくない場合は、コメントとして扱い、無視してください。したがって、カーネル命令で開始するのに最適な文字はコメント文字です。
この方法でのみ "interpretername scriptname"のようなスクリプトを実行するため、コメントにする必要があります。「!」の由来はわかりません。
#!(dmrが覚えている限り)かなり詳細な履歴があり、その理由の説明も含まれています#(そうです、その行は既存のシェルによって無視されなければなりませんでした)。