shebang行解釈のはなし
http://d.hatena.ne.jp/soutaro/20070228/1172682278なぜかコメントをPOSTしようとしたら Internal Server Error になるので、日記に書くけど、 shebang 行の解釈は execve(2)、つまりカーネルが行なう。やったことがないなら man execve してみるといいと思う。ちゃんと解説してあります。
そして、 execve で解釈する shebang 行の取扱については、 POSIX では特に詳しい規定がないため、 OS の実装者によっていろいろ変わる。3年ほど前(jmuk.orgを取る前)にちょっと調べたことがあったのだが。
で、むかしの FreeBSD では、可能なかぎり引数を空白で区分している。ただし、 knu さんによると 6.0 になってからこの仕様が変わり、 Linux と同様に、引数は1つまでとなるようになったらしい。 Mac OSX がきちんと引数を処理するのは、 5.x 時代の FreeBSD をベースにしているから、なのかな(でもそれはユーザランドの話でカーネルには影響ないと思っていたが……)。
で、 knu さんも書いているけど、 Solaris も引数の空白を識別するが、2つめ以降の引数は無言で削除する。つまり、 /usr/bin/env ruby -Ks と書いても、 /usr/bin/env ruby として実行する。知らないひとは注意。
ちなみに、何文字まで見るかというのもやっぱり実装による。記憶が確かなら FreeBSD/Linux は255文字くらい、 Solaris は 4096 文字くらい見たんだったように記憶している。 #/usr/bin/echo aaaaaa…. というファイルを作れば誰でも試せるので、興味があったらどうぞ。メンドくさいので今日は検証していません。
それから「Rubyが解釈する」というのは、あくまでも Ruby 処理系にそのような shebang 行をもつファイルが与えられたときの振舞の話であり、ようは ruby hoge.sh のようにして実行してもオッケーですよ、という話だと思う。