次で始まるシェルスクリプトに出くわすことがよくあります:
#!/bin/bash
この#!
シバンまたはハッシュバンと呼ばれます。シバンは、特にさまざまな種類のシェルを処理するときに、シェルスクリプトで重要な役割を果たします。
このチュートリアルでは、次のことを学びます。
- シバンとは何ですか?
- シェルスクリプトでどのように重要な役割を果たしますか?
シェルスクリプトのシバンとは何ですか?
シバンは、#(ポンドキー)と!の組み合わせです。 (エクスクラメーション・マーク)。この文字の組み合わせは、スクリプトの最初の行で使用される場合に特別な意味を持ちます。これは、特定のスクリプトがデフォルトで実行されるインタープリターを指定するために使用されます。
したがって、スクリプトの最初の行が次の場合:
#!/bin/bash
これは、インタプリタがbashシェルである必要があることを意味します。最初の行が次の場合:
#!/bin/zsh
使用するインタプリタがZシェルであることを意味します。
#! #はシェルスクリプトのコメントに使用されるため、確かに特別ですが、ここでは特別な意味があります。
シェルスクリプトでシバンが重要なのはなぜですか?
つまりね。シェルの実行可能ファイルが後に続くshebangは、スクリプトに必須ではありません。
次のような簡単なスクリプトを作成する場合:
echo "Namaste, folks!"
そして、実行権限を与えて、で実行します。オペレーターの場合、ログインシェルによって実行されます。
[email protected]:~$ cat sample
echo "Namaste, folks!"
[email protected]:~$ chmod u+x sample
[email protected]:~$ ./sample
Namaste, folks!

では、なぜシェルスクリプトの先頭に#!/ bin / bash行が含まれているのですか?
LinuxおよびUNIXシステムで使用できるシェルがいくつかあるためです。これらのシェルの構文はほとんど一般的ですが、構文や処理方法が異なります。
これが、スクリプトで正しいシェルインタープリターを指定することが重要になる理由です。指定しないと、一部のスクリプトが異なるシェルで実行されたときに異なる結果を生成する可能性があります。
簡単な例でそれをお見せしましょう。
ディストリビューションの配列を使用してサンプルシェルスクリプトを作成しました。次に、スクリプトはインデックス2にディストリビューションを表示します。
distros=("Ubuntu" "Fedora" "SUSE" "Debian")
echo "Distro at index 2 is: ${distros[2]}"
シェルインタープリターを指定するためのシバン行を追加していません。つまり、このスクリプトを実行すると、デフォルトのシェル(私の場合はbash)で実行されます:
[email protected]:~$ echo $0
bash
スクリプトの出力を推測できますか?
[email protected]:~$ ./arrays.sh
Distro at index 2 is: SUSE

Bashや他の多くのプログラミングおよびスクリプト言語では配列インデックスが0から始まるため、インデックス2にSUSEが表示されます。しかし、Zシェルではそうではありません。 Zシェルでは、配列インデックスは1から始まります。
システムにZシェルをインストールしています。スクリプトを変更し、シバン行を追加して、スクリプトをデフォルトでZシェルで実行するように指定します。
#!/bin/zsh
distros=("Ubuntu" "Fedora" "SUSE" "Debian")
echo "Distro at index 2 is: ${distros[2]}"
スクリプトを実行したときの出力を推測できますか?
[email protected]:~$ ./arrays.sh
Distro at index 2 is: Fedora

今、違いに気づきましたか?同じスクリプトですが、シバンラインを追加することで違いが生まれました。
そしてこれが、shebang演算子で正しいシェルインタープリターを指定することが重要である理由です。システム管理者は、bash、ksh、zshなど、特定のシェルを念頭に置いてシェルスクリプトを作成できます。ただし、スクリプトを実行するシステムに、自分のシステムと同じデフォルトシェルがあるかどうかを確認することはできません。今、物事は理にかなっていますよね?
シェルを明示的に指定した場合、シバンは無視されます
なぜ「デフォルト」シェルに重点を置いているのですか? shebangは、スクリプトを実行するインタプリタを指定しているためです。
ただし、シェルを明示的に指定することはできます。その場合、シバンラインは無視されます。

シェバンはどの程度正確に機能しますか?
スクリプトの最初の行でシバンを使用すると、指定されたコマンドで指定されたスクリプトを実行するようにシェルに指示します。
基本的に、#!/bin/zsh
と同等です:
/bin/zsh script_name
スクリプトの最初の行がshebangで始まる場合は、シェルインタープリターを指定していることを意味します。
それは部分的にしか真実ではありません。実際、それがシェバンキャラクターの目的です。ただし、shebang行にシェルの実行可能ファイルが含まれている必要はありません。何でもかまいません。
たとえば、#!/bin/zsh
を置き換えます #!/bin/cat
を使用 。 / bin/catはcatコマンドの実行可能ファイルです。
#!/bin/cat
distros=("Ubuntu" "Fedora" "SUSE" "Debian")
echo "Distro at index 2 is: ${distros[2]}"
これは、このスクリプトがcat
で実行されることを意味します コマンドを実行し、スクリプトの内容を表示します。

実行可能コマンドを指している限り機能します。ランダムなものを入れると、エラーが発生します。
シバンラインを次のように変更します:
#!/home/abhishek
明らかに、コマンドの実行可能ファイルを指していないため、不正なインタプリタエラーがスローされます。
[email protected]:~$ cat arrays.sh
#!/home/abhishek
distros=("Ubuntu" "Fedora" "SUSE" "Debian")
echo "Distro at index 2 is: ${distros[2]}"
[email protected]:~$ ./arrays.sh
bash: ./arrays.sh: /home/abhishek: bad interpreter: Permission denied
この記事を終了する前に、さらにいくつか質問に答えさせてください。
-
#
の間にスペースがないことが重要です および!
。次のように使用することはできません:# !/bin/bash
。 - ほとんどのシステムでは、
#!
の間にスペースを入れることができます および/bin/bash
ただし、#!
の間にスペースを入れないようにすることをお勧めします および/bin/bash
。 -
#!
最初の行にある必要があります。そうでない場合、シバン行はコメントとして扱われます。その前に空白行を置くことさえできません。
理由をもっとよく理解していただければ幸いです。 Linuxのシェルスクリプトの最初に使用されます。質問や提案があれば、遠慮なくコメントを残してください。