binfmt_miscの力でBOM shebangをサポートする
概要: binfmt_miscを使うとBOM shebangを擬似的にサポートできる。ただしインタプリタ側がサポートしてないと意味がない。
事の発端
Windowsのメモ帳がLF改行をサポート→でもUTF-8で保存しようとするとBOMがついて悲しい→shebangにBOMがつくと動かないのが悲しい
やったこと
Linuxのbinfmt_miscという機能を使って、BOMのついたshebangを動くようにしてみました。
binfmt_miscはLinux固有の仕組みで、ELFとshebang以外の通常ファイルを実行しようとしたときに、/proc/sys/fs/binfmt_misc
内の一覧にしたがって、ファイルのヘッダまたは拡張子によってインタプリタを選択するというものです。今回は "\xEF\xBB\xBF#!"
が来たときにあらかじめ用意しておいた /usr/local/bin/bomshebang
というプログラムを起動するように設定しました。このbomshebangはOSの挙動をまねてshebangを解析し、本来のインタプリタを呼び出します。
できたこと
たとえばPerlのスクリプトにBOMがついても動くようになります。
Bashはインタプリタ側がサポートしていないので駄目みたいです。bomshebang側でソースを書き換えるなどの工夫をすればいけるかもしれませんが、そうするとソースを汚してしまうし、書き込めない可能性もあるので、/tmpに移動する必要がありそうですが、インタプリタによってはソースの位置や名前が重要かもしれないため、この方法では予期しない非互換性が発生しそうです。
まとめ
Linux自体をBOM shebangに対応させるのは簡単でした。しかし、インタプリタ側が対応していないとOS側だけでうまくやるのは難しそうです。