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


487

私は作りました 以前にBashスクリプトを作成したあり、それらはすべて#!/bin/bash最初はなくても問題なく実行されました。

それを入れる意味は何ですか?何か違うのでしょうか?

また、どのように発音しますか #ますか?私はそれ!が「強打」と発音されることを知っています。

どう#!発音しますか?


8
選択する必要がない限り、その必要はありませんし、すべきではありません。(#!/ bin / sh)を使用して、(POSIX)シェルとbashの違いについて学びます。別のシェルのシステムで自分のスクリプトを機能させたいときに、履歴書が大きくなり過ぎる前日が来るでしょう。
イェンス

50
「ハッシュバン」または「シェバン」と発音されます。
ビーチハウス2013年

22
これは、スクリプトを実行可能ファイルとして実行した場合にのみ実行されることに注意してください。だから、あなたが実行可能フラグを設定して、入力した場合./yourscript.extension、たとえば、./helloworld.pyまたは./helloworld.sh、それは次のようになり、そのトップライン、で通訳を探します#!/bin/python!#/bin/bashのようなスクリプトを実行する際のに対し、python helloworld.pyそれがコメントされているので、最初のラインが観察されることはありませんアウト。したがって、これはシェル/カーネルの特別なシーケンスです。
JFA

@JFAは!#をpythonと#!バッシュのために?
AAI 2017

1
@AjeyaAnand間違いではありませんでした
JFA

回答:


426

これは慣例であるため、* nixシェルは実行するインタープリターの種類を認識しています。

たとえば、古いバージョンのATTのデフォルトはsh(Bourneシェル)でしたが、古いバージョンのBSDのデフォルトはcsh(Cシェル)でした。

今日でも(ほとんどのシステムでbashを実行する「Bourne Again Shell」)、スクリプトはbash、python、perl、ruby、PHPなどで使用できます。たとえば、#!/bin/perlまたはが表示されることがあります#!/bin/perl5

PS:感嘆符(!)は「バング」と呼ばれています。シェルコメント記号(#)は「ハッシュ」と呼ばれることもありますます。

PPS:覚えておいてください-* nixでは、サフィックスとファイルタイプの関連付けは単なる規則であり、「規則」ではありません。実行可能ファイルは、バイナリプログラム、百万スクリプトタイプと同様に他のもののいずれであってもよいです。したがって、の必要性#!/bin/bash


1
私は他に役立つ何か、$#を見つけました。なんていうの?
ノード忍者

91
シバンはシェル規則ではなく、syscallを処理するときにカーネルによって解釈されexecve(2)ます。したがって、シバンはカーネル規約であり、シェル規約ではありません。
Basile Starynkevitch、2012年

10
また、Vimなどの一部のエディターは、ファイルに拡張子がない場合に構文強調表示の言語を決定するのに役立ちます。シバンがない場合、Vimはプレーンテキストファイルと同じbashスクリプトを表示します。
Aaron Blenkush、2013

1
それは私はあなたが追加する必要があるかどうかを思ってしまう#!/bin/shようなものに.profileランがあることやもののonLoad
Kolobキャニオン

5
つまり... hash-bang-slash-bin-slash-bash
Bernat

135

より正確に言うと、実行可能モード)ファイルの最初の2バイトであるshebang #!は、(プログラムを実行する)execve(2)システムコールによって解釈されます。しかし、POSIX仕様ではシバンについては触れていません。x execve

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

ユーザーの中でインタープリター(eg)を見つけるための素晴らしいトリック(またはおそらくそれほど良くないトリックpython)は、たとえば(常にすべてのLinuxで)プログラム$PATHを使用することです。env/usr/bin/env

 #!/usr/bin/env python

ELF実行可能ファイルはすべてインタープリターになることができます。あなたも使用することができます#!/bin/catまたは#!/bin/trueあなたがしたい場合は!(しかし、それはしばしば役に立たないでしょう)


8
ハックの説明については、この質問を参照してください#!/usr/bin/env
キーストンプソン

引数をpythonに渡したい場合、どうすれば実際に実行したいですか#!/usr/bin/env bash -x。それ、どうやったら出来るの ?
indianwebdevil 2017年

その単純な私はそれを私自身が見つけた、その後に#!/usr/bin/env bash -x
パラメーターを

bashほとんど常に/bin/bashそうなので、あなたのシバンはあるべきです#!/bin/bash -x
バジル・スタリンケビッチ

50

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

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


2
私がすでにbashを使用している場合、#!/ bin / bashが見つかった場合、別のbashインスタンスを開始しますか?すでにbashを使用していて、除外した場合はどうなりますか?違いはありますか?
ノード忍者

2
@javascriptninjaいずれかの方法で新しいbashシェルを開始します。bashの場合、既にbashを使用している限り、実際には違いはありません。シバンは、(a)pythonやperlのような単なるシェルではない何かで実行する必要がある場合、または(b)bashシェルを使用しない(つまり、zshを使用する)場合にのみ問題になります。 bashで実行する必要があるものを実行します。
austin1howard 2012年

しかし、私の意見では、コードを読んでいる誰かが何が起こっているのかを知るために、シバンを含めることは良い習慣です。
austin1howard 2012年

2
誤り:execve(2)syscallは$SHELL変数を使用しません。シバンを解釈しているのはカーネルです。
Basile Starynkevitch、2012年

1
正しい@BasileStarynkevitch、カーネルのエルフローダーはシバンを解釈します。私は、シバンが提供されなかった場合、$ SHELLが使用されると述べていました。
austin1howard 2012年

19

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

シバンがマジックナンバーであることを知っておく価値もありますあります。これは、ファイルを特定のインタープリターのスクリプトとして識別する、人間が読める形式です。

シバンがなくても「機能する」というのは、問題のプログラムが、使用しているのと同じシェル用に書かれたシェルスクリプトだからです。たとえば、JavaScriptファイルを作成してから、#! /usr/bin/js(または同様の)JavaScriptを使用して「シェルスクリプト」を作成することもできます。


18

オペレーティングシステムは、デフォルトのシェルを使用してシェルスクリプトを実行します。スクリプトの最初にシェルパスについて言及しているので、OSにその特定のシェルを使用するように要求しています。持ち運びにも便利です。


15

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

Bashは、kshおよびからコードを取り込んで、長年にわたって進化してきましたsh

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

#! 多くの場合、「ハッシュバン」、「シバン」、または「シャバン」と呼ばれます。


9

それはシバンと呼ばれています。番号記号と感嘆符文字(#!)で構成され、その後に/ bin / bashなどのインタープリターへの絶対パスが続きます。UNIXおよびLinuxでのすべてのスクリプトは、最初の行で指定されたインタープリターを使用して実行されます。



0

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.