「シバン」が「#!」で始まるのはなぜですか?


10

なぜ「彼女-bangが」で始まるない#!ように、#!/bin/bash?私はこれがどのように行われるかを常に受け​​入れていますが、その背後に理由はありますか?

なぜ#; 通常はコメントではありませんか?それともコメントとすべきなのか?


4
ウィキペディアに#!(dmrが覚えている限り)かなり詳細な履歴があり、その理由の説明も含まれています#(そうです、その行は既存のシェルによって無視されなければなりませんでした)。
Gilles「SO-邪悪なことをやめなさい」

ウィキペディアをチェックするのを逃しました:)
Johan

1
シェルが無関係なCR / LFがある場合はそれを取り除くのに十分スマートであることを願っています...;)
アーロンD.マラスコ

回答:


16

通常、シバンは単に#!!「バング」と呼ばれ、「彼女」は「SHArp」または「haSH」のいずれかの破損であるように見えます)を指します#-行全体がシバン行と呼ばれます

処理方法がわからないものとの後方互換性のために、意図的にコメント文字で始まっています。これ!はおそらく、ファイルを開始するランダムなコメントと区別するためだけなので、で始まるファイル# this is my script!this is my script!インタープリターを実行しようとしません


2
Bang !は、他のコンテキストで実行されるコマンドを示すためによく使用されます。たとえばvim、独自のコマンドラインを持つ他のプログラムでは、多くの場合、bangは内部インターフェイスではなくシステムシェルでコマンドを実行するためのエスケープ文字です。
カレブ2011

4

これを理解するには、スクリプトの最初の行が2つの異なるプログラムによって実際に2回読み取られることを理解する必要があります。カーネルは最初にファイルを開き#!、最初の行でその文字シーケンス()を探します。見つかった場合は、そこに示されているシェルプログラムを実行し、ファイル名をパラメーターとして渡します。(たとえば、ファイル/home/me/fooがで始まる場合、#!/bin/shカーネルはを実行します/bin/sh /home/me/foo)。

次に、シェル(bin/shまたは指定されたインタプリタプログラム)がファイルを読み取ります。シェルはシバン行については何も認識していませんが、ファイル内の他の行と同じように最初の行を読み取ります。すべてを読み取ります。シェルがクラッシュしたり、その動作を変更したりしたくない場合は、コメントとして扱い、無視してください。したがって、カーネル命令で開始するのに最適な文字はコメント文字です。


それが実際にカーネルであるのか、それはあなたが作業している現在のシェルであり、シバンを解析してスクリプトをプッシュするようだ
Johan

いいえ、それはカーネルそのものであり、ライブで直接行われます。シェルを使用してスクリプトを実行していない場合でも機能します...シェル以外にファイルを実行する方法は他にもあります。たとえば、Cプログラムから "exec"システムコールを使用して
JoelFan

en.wikipedia.org/wiki/Shebang_(Unix)#Magic_number "#!" asciiにはバイト0x23 0x21があります-exec()がこれらのバイトを検出すると、動作は行の残りの部分をインタープリターへのパスとして扱うことです。
アーロンマクミリン2018年

1

この方法でのみ "interpretername scriptname"のようなスクリプトを実行するため、コメントにする必要があります。「!」の由来はわかりません。


1
./scriptnameを実行しただけでも、インタプリタはまだシーバン行を認識しているため、コメントにする必要があります。
psusi

1
または、より詳しく:シバン: '#!' インタプリタから見えないように設計されているため、コメント文字「#」で始める必要があります。代わりに、カーネル 'exec [lv] *'システムコールのセットによって「認識」(および解釈)されます。
arielf 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.