Windowsでは、ファイルの形式を判別するのに拡張子を使う。MS-DOSでは、ファイル名8文字、拡張子3文字の、いわゆる8.3形式が使われていて、拡張子の利用が強制されていた。現在のWindowsでは、拡張子部分はピリオドも含めてファイル名の一部として扱われるため、拡張子の利用は強制されないが、基本的なファイルタイプの判別は拡張子で行われている。ただし、拡張子は、誰も管理しておらず、誰でも勝手に付けることができる。自分が困らなければ画像ファイルに“.txt”という拡張子をつけてもかまわない。

Androidでは、ファイルを外部のプログラムに処理してもらう場合、メディアタイプ(MIMEタイプ、あるいはContent-Typeともいう)でファイル形式を指定する。ただし、拡張子からメディアタイプを推定するAPIも用意されており、拡張子に頼っているともいえる。

というのも、画像や音声、動画などの著名な形式のファイルが流通する場合、拡張子がついたファイル名になっていることがほとんどだからだ。Windowsで多くのファイルが作成されるという理由もあるだろうが、少なくとも拡張子があれば、ファイル形式を人間が簡単に把握できるからだ。

Unix/Linux系では、オペレーティングシステムとしては、基本的に拡張子を扱わない。このため、ファイル形式などを判別する部分は単に“Suffix”などと呼ばれる。Unix/Linux用のプログラムの仲には、拡張子と同じ形式のSuffixを利用しているものもある。基本的にテキストファイルであるC言語のソースコードに“.c”というSuffixを付けるのも広く行われているUnix/Linuxの慣習だが、makeコマンドは、拡張子の関係―――たとえば.cファイルから.oファイルが作られる―――を定義することで、コンパイル用を半自動的に行う。

Unix/Linux系には、昔からfileコマンドがあり、ファイル先頭部分の「マジックナンバー」を使ってファイルタイプを判別していた。fileコマンドは、1973年のUnix Ver.4に搭載されていた。現在のLinuxにもfileコマンドやマジックナンバー判別のためのmagicファイルがある。magicファイルは、マジックナンバーを識別するためのルールを記述したもので、現在の多くのLinuxディストリビューションでは、高速化のためコンパイルされたmagic.mgcファイルを使う。

こうした仕組みを使うかどうかはアプリケーション側の問題だが、基本的にUnix/Linux自身は、プログラム実行などでは部分的にマジックナンバーを利用する。1つは、バイナリ実行ファイルの簡易な検査であり、もう1つは、シェルスクリプトのShebang(シバン)である。バイナリ実行ファイルは、読み込みの過程で解釈されるが、ファイル先頭でマジックナンバーが一致しなければエラーになる。

シバンは、bashなどのスクリプトファイルの先頭に置かれる“#!”に続けてスクリプト実行プログラム(インタプリタ)のパスが指定される。execveなどのシステムコールは、指定されたファイルがバイナリ実行ファイルではない場合、シバンかどうかを判別し、そうであれば、インタプリタを起動してスクリプトを起動する。

Windowsでもバイナリ実行形式のEXEファイル(拡張子は.exe)にはマジックナンバーが先頭に埋め込まれており、簡易な検査が可能だ。もともとは、16bitモードのバイナリ実行ファイルCOM形式との区別に使われていたものだ。現在では、“.com”という拡張子は利用できるが、中身はEXE形式である。Windowsには、その他にも、スクリーンセーバー(.scr)やコントロールパネルアプレット(.cpl)、フォントファイル(.fon)など中身が実行ファイル形式になっているものがいくつかある。

Windowsのプログラム実行は、Win32APIのCreateProcessで行われるが、Windowsの標準スクリプトであるBatchファイルも同じAPIで起動ができる。ただし、シバンのような仕組みがなく、インタプリタはcmd.exeに固定される。

Unix/Linuxのfileコマンドやmagicファイルに関しては、manページに解説がある。また、以下のサイトにソースコードがあり、magicフォルダーにmagic.mgcの定義がある。

・GitHub file/file

https://github.com/file/file

拡張子は誰も管理しておらず、ある意味不明確なシステムだ。拡張子を偽装することは簡単で、これを利用するウィルスなどもあり安全ではない。しかし、多くのファイルがこれを利用していて、もはや別のものに置き換えることは難しい。ユーザーにできるのは、ダウンロードしたファイルのマジックナンバーと拡張子に齟齬がないかを調べるぐらいしか方法がない。Windowsでは、WSLが使えるので、fileコマンドが利用できる。

wsl file ./x.exe

などとすればよい(ファイルパスの区切りはLinux側のスラッシュである点に注意)。

今回のタイトルの元ネタは、ピアズ・アンソニイの「魔法の国ザンス」シリーズ(ハヤカワ文庫 FT。原題Xanth)。赤塚不二夫の「おそ松くん」を知る人からみれば、イヤミのセリフのようにしか思えないシリーズタイトルである。