シェルプログラムの先頭に付ける#!(シバン)の意味とメリット

調べたことのメモ。

シバンとは

以下のシェルプログラムの先頭に付いているような#!の行をシバン(shebang)と呼ぶ。

unnko.sh

#!/bin/bash
echo "うんこ"

この場合、このシバンが付いていることによって

「このプログラムは/bin/bashで実行されるべし!」みたいな意味になる。

シバンを付ける意味(付けないとどうなるのか)

シバンが付いていなくても

$ /bin/bash ./unnko.sh

(./はカレントディレクトにあるファイルって意味ね)

で実行すると「unnko.sh/bin/bashのシェルプログラムとして実行しろ!」という意味になるけど

シバンが付いていると、実行ファイルとしても実行することができるようになる。

 

例えばさきほどunnko.shファイルは、シバンが付いているので

$ ./unnko.sh

で実行すると「unnko.sh/bin/bashのシェルプログラムとして実行しろ!」と同じ意味になる。

(Windowsで言うところの.exeファイルを実行するようなノリで実行できる)

 

逆にいうと、シェルプログラムはシバンに書かれたとおりに実行してしまうので

unnko.sh

#!/うんこ/もりもり
echo "うんこ"

というように書いて

$ ./unnko.sh

で実行すると「unk.sh/うんこ/もりもりのシェルプログラムとして実行しろ!」という意味なってしまうので、もちろん動かない。

シバンのメリット

おそらくですが「どのシェルで動かすように作られたプログラムなのか?」を明記できるのがメリットだと思われます。

 

つまりですね。

シェルって

  • bash(私が使っているUbuntuの場合、ログインシェルはこれ)
  • dash(私が使っているUbuntuの場合、/bin/shのシンボリックリンクがこれ)
  • ash
    ・・そのほか

みたいな感じでいろいろなシェルがあるわけですが、シェルによっては「この表記は使えるけどこの表記は使えない」みたいな俺ルールがあるらしいんですね。

そして、その俺ルールってかなりややこしいらしいんですよ。ベテランでもしっかり見ないと分からないレベルで。

 

つまり、シェルプログラムって中身を見て「あ、これはシェルプログラムだな」というのは判別できますけど

「どのシェルで動かすべきなのか?」までは中々分からないわけです。作った本人以外は。

そんなわけでシバンがないと「どのシェルで動かしていいか分からないからとりあえずbashで動かしてみるか!」とか言って動かすしかないわけで、それで動かしてみると「なんか分からないけどエラーがでた」みたいなことになるかもしれないわけです。

 

そんなわけで、シバンを書くことで「どのシェルで動かすように作られたプログラムなのか?」を明記できるのでみんなハッピーだよね!!

・・ってことだと思われます。

 

(もし間違ってる場合は、ご指摘おねがいします…!!)

 

おわり

Linux
スポンサーリンク
この記事を書いた人
penpen

1991生まれ。WEBエンジニア。

技術スタック:TypeScript/Next.js/Express/Docker/AWS

フォローする
フォローする

コメント

タイトルとURLをコピーしました