2012-02-29 10 views
1

すべてのbashスクリプトの非常に開始時書き込み開始は

#! /bin/bash 

背後にある理由は何ですか?

私はそれがハックのようなものだと知っていますが、どのように正確に動作するか知りたいのですが?

+1

男性はシェバングの機能の素敵なデモのために –

答えて

3

あなたは

bash foo.sh 
/bin/bash foo.sh 
dash foo.sh 
sh foo.sh 

のように、明示的なインタプリタでスクリプトを呼び出した場合は、あなたの選びだしインタプリタは関係なくシェバングは単なるコメントである、言うこと、使用されていません。

は、スクリプトを実行可能にし、それを起動した場合:

chmod a+x foo.sh 
./foo.sh 

カーネルがシェバングを探して、そこに指定されたインタプリタでプログラムを起動します。カーネルはPATHを知らないので、全体のパスを指定する必要があり、またはenvを使用する必要があります。

#!/usr/bin/env python 

プログラムのローカルパスを選択します。

dash、bash、zshなどは完全に互換性がないため、作者は自分が行っていることを知っている必要があるため、特定のインタプリタなしでプログラムを呼び出す必要があります。

あなたのシステムにおそらくsh/bin/bashへのリンクですが、注意してください!シェルはそれがどのように呼び出されたかを調べることができ、bashはPOSIXモードと呼ばれるやり方で動作することができます。POSIXモードはわずかに異なり、通常の動作のサブセットのみです。

異なるプラットフォームで実行される可能性のある、インストール用またはサーバ用のスクリプトを記述する場合、異なるシェルが使用できるOsX、Linux、Solarisなどと考えると、このサブセットに限定して互換性のある、再利用可能な結果。

しかし、私用のマシンでは、zshbashのような便利なシェルを好むかもしれません。

+0

+1、この回答は明らかです。 – Benoit

1

次(これは有害ではないことを、私は正確なもの)を試してみてください。

  • 含む新しいファイルを作成します。chmod +x the_file

  • で実行ビットをセット

    #!/bin/rm 
    whatever 
    
  • ./the_file
  • あなたのファイルが魔法のように消えたことを確認してください。

したがって、実行可能ファイルのshe-bangは、インタープリタとして使用される別の実行可能ファイルへのパスを示します。

+1

笑:) +1をexecve' 'を参照してください。 – anubhava

0

UNIXは、ファイルの内容を識別するために拡張子(.sh、.batなど)を使用しません。

"#!"表記法(shebang)は、期待されるインタプリタへのパスを提供することによってスクリプトの実行方法をカーネルに伝えるために使用されるmagic numberです。

0

スクリプト内のBourneシェルまたは互換シェルを起動する。

ルック:Shebang