Shebang 行について

ウェブ上で配布されている Perl で書かれた CGI プログラムを見ると、1行目には必ず

#!/usr/local/bin/perl

のような行が書かれています。この行は Shebang 行(シーバン行)と呼ばれます。


この Shebang 行は、そもそも UNIX にて「スクリプト」と「プログラム」を関連付ける為に使われていました。UNIX でファイルを実行プログラムのように実行すると、自動的に1行目が読み込まれ、スクリプトを実行するプログラムで開かれるようになっているのです。

#!/usr/local/bin/perl

の "/usr/local/bin/perl" が Perl スクリプトの実行プログラムの場所(絶対パス)を表しています。UNIX の実行プログラムには .exe のような拡張子がつかないので、このパスは「/usr/local/bin/」というディレクトリ(フォルダ)の中にある「perl」というプログラムを表している事になります。
例えば Rubyスクリプトの場合、1行目は

#!/usr/local/bin/ruby

のように Ruby スクリプトの実行プログラムを指す必要があるわけですね。(^_^)
Windows では、この関連付けの仕組みを拡張子で行なっているので、スクリプトファイルの実行に Shebang 行は必要ありません。この Shebang 行は単なるコメントとして解釈されます。


では、なぜ CGI スクリプトを書く場合にも必要なのでしょうか。世界で最も良く使われているサーバーソフトウェアとして Apache がありますが、実はこの Apache に組み込まれている CGI 機構も、スクリプトを実行するプログラムを Shebang 行から判断しているからです。
僕の場合 Windows 上で CGI プログラムの開発・テストを行うわけですが、Windows 上で Apache を実行して Perl で書いた CGI プログラムをテストする場合、1行目は以下のように書く必要があります。

#!C:/Perl/bin/perl

なぜなら Perl を実行するプログラムは「C:\Perl\bin\perl.exe」だからです。(.exe は省略可能)
実際にウェブ上で公開するには、CGI プログラムをウェブサーバーへアップロードしますが、このウェブサーバーが Apache で稼動しているなら、Shebang 行を適切なパスに直してからアップロードする必要があります。実行プログラムへのパスはサーバーによって異なりますが、「/usr/bin/perl」や「/usr/local/bin/perl」が多いようです。
これが面倒な場合は、Perl を「C:\usr\local\」など、サーバー側でのパスに合わせてインストールすればいいようです。遅かった……。(^_^;)
追記:fbis さんのコメントによると、

少々ハックっぽいですが、perl.exeそのものを「C:¥usr¥local¥」に”コピペ”すればOKだったりします。苦肉の策ということで。

との事です。なるほど! とにかく perl.exe があれば大丈夫なんですね。(^_^) インクルードパス @INC がどうなるのかちょっと心配でしたが、C:\Perl\bin\perl.exe を C:\usr\local\bin\perl.exe にコピーして試したみたところ、問題ないようです。

C:\>C:\usr\local\bin\perl.exe -e "print \"$_\n\" for (@INC)"
C:/Perl/lib
C:/Perl/site/lib
.

PATH が通っているからでしょうか? ちょっと不思議ですね。
fbis さん、便利なハック(?)、ありがとうございました!


lighttpd の場合は、Windows のように拡張子を実行プログラムに関連付けるスタイルなので、Shebang 行は使われません。ローカルでテストした後、修正せずにアップロードできるので、とても楽チンですね。
Windows でのお手軽ローカルテストには lighttpd がぴったりな気がします。


ちなみに、「Shebang 行」の由来は「#」を「She」、「!」を「Bang」と呼ぶことから来ているとか。「#」は「Sharp」ですが、それが訛ったのでしょうか。「!」はいかにも「バン!」という感じですね。(^_^)