web-dev-qa-db-ja.com

スクリプトファイルの先頭に#!/ bin/bashを付ける必要があるのはなぜですか。

私は以前に Bash スクリプトを作成したことがありますが、最初はこれがなくてもすべて正常に動作していました。それを入れることのポイントは何ですか?物事はどう違いますか?

また、#の発音はどうですか?私は!が "bang"と発音されていることを知っています。

#!はどのように発音されますか?

430
node ninja

これは慣例なので、* nixシェルは実行するインタプリタの種類を知っています。

たとえば、古いバージョンのATTはデフォルトで sh (Bourne Shell)に、古いバージョンのBSDは csh (C Shell)にデフォルト設定されています。

今日でも(ほとんどのシステムがbashを実行している場所、 "Bourne Again Shell" )、スクリプトはbash、python、Perl、Ruby、PHPなどで作成できます。例えば、#!/bin/Perl#!/bin/Perl5のようになります。

シモンズ:感嘆符(!)は愛情を込めて "bang" と呼ばれています。シェルのコメント記号(#)は "hash" と呼ばれることもあります。

PPS:覚えておいてください - * nixの下で、接尾辞をファイルタイプと関連づけることは単なる 規約 であり、 "規則" ではありません。 実行可能ファイル は、バイナリプログラム、100万種類のスクリプトタイプのいずれか、およびその他のものにすることができます。それゆえ#!/bin/bashの必要性。

379
paulsm4

より正確に言うと、 Shebang#! executable xmode )ファイルの最初の2バイトの場合、 execve(2) と解釈されます。システムコール(プログラムを実行します)。しかし execveのPOSIX仕様 はShebangに言及していない。

それにはインタプリタ実行ファイルのファイルパスが続かなければなりません(BTWは相対パスでも可能ですが、ほとんどの場合絶対パスです)。

ユーザの$PATHの中でインタプリタ(例えばpython)を見つけるためのNiceトリック(あるいはおそらく そんなにいい one)は、例えば以下のようにenvプログラムを使うことです(すべてのLinuxでは/usr/bin/env).

 #!/usr/bin/env python

どのELF実行ファイルでもインタプリタになることができます。必要に応じて、#!/bin/catまたは#!/bin/trueを使用することもできます。 (しかしそれはしばしば役に立たないでしょう)

122

それは Shebang と呼ばれています。 unix-speakでは、#はシャープ(音楽のように)またはハッシュ(Twitterのハッシュタグのように)と呼ばれます。ビッグバンと呼ばれています。 (あなたは実際にあなたの前のシェルコマンドをbang-bangと呼ばれる!!で参照することができます)。それで、まとめると、haSH-BANG、またはShebangになります。

#の後の部分!実行するためにどのプログラムを使用するかをUnixに指示します。指定されていない場合は、bash(またはsh、zsh、または$ Shell変数がなんであれ)を試しますが、指定されている場合はそのプログラムを使用します。さらに、#はほとんどの言語でコメントであるため、後続の実行では行は無視されます。

47
austin1howard

オペレーティングシステムは、デフォルトのシェルをシェルスクリプトの実行に使用します。そのため、スクリプトの冒頭にシェルパスを記載しているので、あなたはOSにその特定のシェルを使用するように求めています。 移植性 にも便利です。

16

Shebang は、#!の後に指定されたプログラムを、実行しようとしたときに問題のファイルのインタプリタとして使用するようにローダに指示するものです。したがって、foo.shが先頭にある#!/bin/bashというファイルを実行しようとすると、実際に実行されるコマンドは/bin/bash foo.shです。これは、プログラムごとに異なるインタプリタを使用するための柔軟な方法です。これはシステムレベルで実装されたもので、ユーザーレベルのAPIはShebangの規約です。

Shebangは マジックナンバー - 与えられたインタプリタのスクリプトとしてファイルを識別する人間が読めるものであることも知っておく価値があります。

Shebangがなくても「動作する」ということについてのあなたの論点は、問題のプログラムがあなたが使用しているものと同じシェル用に書かれたシェルスクリプトであるという理由だけです。たとえば、JavaScriptファイルを作成してから、#! /usr/bin/js(またはそれに類するもの)を入れて、JavaScriptの「シェルスクリプト」を作成できます。

16
Noufal Ibrahim

すべてのディストリビューションにはデフォルトのシェルがあります。 bashはほとんどのシステムでデフォルトです。たまたま別のデフォルトシェルを持つシステムで作業している場合、スクリプトがBash専用に書かれていると、意図したとおりに機能しない可能性があります。

Bashはkshshからコードを取って長年にわたって進化してきました。

スクリプトの最初の行に#!/bin/bashを追加すると、指定されたShellを呼び出してスクリプト内の後続のコマンドを実行するようにOSに指示します。

#!はしばしば「ハッシュバング」、「シェバン」、「シャバン」と呼ばれます。

14
jaypal singh

これは Shebang と呼ばれます。これは、番号記号と感嘆符(#!)の後に、/ bin/bashなどのインタプリタへのフルパスが続きます。 UNIXおよびLinux上のすべてのスクリプトは、最初の行に指定されたインタプリタを使用して実行されます。

9
Uday Sawant

また、#!/ bin/bashの後に他のいくつかのパラメータが表示されます。
#!/bin/bash -v -x
これを読んでもっとアイデアを得てください。
https://unix.stackexchange.com/questions/124272/what-do-the-arguments-v-and-x-mean-to-bash

0
star

そのライブラリをすぐに利用できない別のシステムを使用している人にとっては役に立つことがあります。それが宣言されておらず、そのシステムでサポートされていない関数がスクリプトにある場合は、#/ bin/bashを宣言する必要があります。私は仕事の前にこの問題に遭遇しました、そして今、私はただ練習としてそれを含めます。

0
Beardy