シバン(shebang)をやっと理解した

こんにちは。
composerで提供されているコマンドの中身を見ていたら

#!/usr/bin/env php

と書かれており、そのあとの行にはPHPのコードが。

$ ./shebang-php

のように、phpコマンドを使わずに直接PHPのコードが実行出来るようになっていました
この仕組みは シバン(shebang) というらしいです

シバン自体はBashのスクリプトで似たようなものを何度も見たことがあったのですが、おまじない的に捉えており意味を深く考えていませんでした
拡張子や実行コマンドに縛られず、何の言語で書いても良い実行可能なコードを作るのに適しているのでは? ?
と疑問が湧いたので、調べて理解したものを残しておきます

シバンとは

冒頭でも書きましたが、#!で始まる行のことらしいです。

シバン (Unix) – Wikipedia

/usr/bin/envってなに

各種インタプリタのパスは環境によって変わることがあるので、環境によらず汎用的に動くようにするには#!/usr/bin/env {言語名}と書くのが一般的なようです

いまさら聞けない、#! で始まる1行目の名前とenv指定時の挙動 – プログラマ 福重 伸太朗 ~基本へ帰ろう~

例:PHP

#!/usr/bin/env php
<?php

echo "Hello, world!\n";

例:Ruby

#!/usr/bin/env ruby

puts "Hello, world!\n"

例:Nodejs

#!/usr/bin/env node --harmony_proxies

// Harmonyのオプションを有効にすることも出来る模様
console.log('Hello, world!')

コンパイル型の言語でも使えるの?

これってコンパイル型の言語、例えばGoでも使えるのかな?
と調べてみたところ、ゴリ押しならやれそうでした。

//usr/bin/env go run $0 $@ ; exit

Go言語でshebang

単にgoコマンドを実行しているだけなので、滅茶苦茶遅いです。
GoのCLIツールは早いのが大きな魅力なのに、遅いんじゃ使い物になりません。。。

まとめ

シバンは分かってしまえば簡単なんですが、なかなか覚えようと思うきっかけがないと思います
もしシバン知らない人がいらっしゃったら、シバン便利なので広めてあげて下さい