シェル(bash)がWindowsネイティブで動作する「Bash (on Ubuntu) on Windows」が話題だが、我らがOS Xでは特別な対策なしにシェルを利用できる。しかし、具体的にどう違うか問われたら……という向きも少なくないはず。今回は、その辺りのもやもやを取り除くべく、OS Xとの比較を行ってみたい。

ひたひたと迫りくる「Bash (on Ubuntu) on Windows」

まず、OS XはUNIXである。由来からしてBSD UNIXの系譜に連なることは明白だが、v10.5 Leopard以降はSingle UNIX Specification Version 3(SUSv3) 準拠であることを意味する「Open Brand UNIX 03」に登録されている。もちろん、本稿執筆時点における最新バージョンのv10.11 El Capitanも同様だ(リンク)。

Windows上でbashがネイティブに動作するという触れ込みの「Bash (on Ubuntu) on Windows」(以下、BoW)も、広い意味でのUNIXと言っていい。LinuxはあくまでUNIXライクなOSであり、UNIXを名乗るための正式な承認は得ていないが、

BoWはWindowsサブシステム下で動作するUbuntu Linuxであり、バイナリがシステムコールを実行すると(カーネルモードで動作する)ドライバ「LXCORE.SYS」および「LXSS.SYS」に処理が引き継がれる。完全にネイティブで動作するOS Xに比べればワンクッション置いた形とはなるが、エミュレーションや仮想マシンよりもオーバーヘッドが少なく、ネイティブに近いパフォーマンスを発揮できる。サブシステムで動作するため、Windowsのリソースへ直接アクセスできるというメリットもある。

なにが言いたいかというと、これまでOS XはUNIX入門環境として圧倒的に有利 -- セットアップ不要で初期投資額も低廉 -- な位置にあったが、BoWによりWindowsが一気にキャッチアップしたということ。いわゆるLAMPのプラットフォームとしても、UNIX/Linuxを対象としたコンピュータ教育の教材としても、Windowsは遜色ない存在として認知されつつある。

コマンドプロンプトで「BASH.EXE」を実行すると、Ubuntu Linuxのシェル(bash)が起動される

Bash (on Ubuntu) on Windowsの概念図。Windowsサブシステム上でUbuntu Linuxが動作するところがポイントだ

扱いやすさではOS X、しかし……

ところで、OS XとBoWのシェルには多少の違いがある。OS XのそれはUNIXで一般的な流れ -- ユーザのログイン直後に起動される(ログインシェル) -- であるのに対し、BoWはWindowsのユーザランドから起動されるからだ。ややこしい話だが、BASH.EXEというシステムコマンド(Win32アプリ)が実行されるとBoWが有効になり、コマンドプロンプトなどの仮想端末を介してbash(こちらはLinuxのELFバイナリ)が実行される。

BoWでもbashは(サブシステム上では)ログインシェルであり、/etc/passwdの内容に従い起動される。デフォルトではその選択の幅が狭く、ログインシェルとして使用可能なシェルが記載される「/etc/shells」にはbashおよびdash -- 現行のUbuntuはログインシェルをbashとしたままデフォルトのシェルを簡易版シェルdashに変更している -- 程度しかないが、起動の流れそのものは同じだ。

こうなると、いよいよもって「UNIXとの親和性」(UNIXそのものなのだが)というOS Xの有利性は損なわれてしまいそうだが、システム標準の仮想端末の完成度という一朝一夕には越えられない壁がある。前述したログインシェルにしても、Terminalでは(ログインシェルを使わず)任意のシェルを起動できる。タブのサポート、背景色などを自由にカスタマイズできる「プロファイル」、テキストエンコーディングのカスタマイズなどなど、仮想端末としてはTerminalのほうが格段に高機能だ。

ログインシェルそのものの変更も、OS XではGUIで作業できる。システム環境設定の「ユーザとグループ」パネル(管理者権限によるロック解除が必要)で対象ユーザをcontrol+クリック、現れた「詳細オプション...」からログインシェル項目を変更すればOKだ。BoWではchshコマンドを使わねばならず(OS Xでもこの方法を利用できる)、ハードルの高さは否めない。最初からいろいろ揃っていて扱いやすい、ここがBoWに対するOS Xのアドバンテージであることは確かだろう。

とはいえ、BoWの中身はUbuntu Linux。apt-getコマンドを使えばかんたんにパッケージを追加できるし、その種類も豊富。XmingなどのXサーバを用意すれば(以前OS Xに標準装備されていたX11.appを思い出してほしい)、GUIも利用できる。LAMPのような開発/試験環境をWindows上で構築したいユーザにとってBoWは都合がいいはずで、実際その方向で検討し始めているデベロッパーも少なくない。初期のOS Xが、デベロッパーの支持でユーザ数を増やしたことを思い出せば、これがどのような意味を持つかわかるはず。今後のユーザ動向に注目だ。

Windowsのタスクマネージャを見れば、BASH.EXEとbash(サブシステム上のプロセス)の違いは一目瞭然

BoWはサービスの類いがほとんど実行されないため、起動直後はプロセスがinitとbash程度しか存在しない

Terminalではログインシェル以外にも任意のシェルを使うことができる

システム環境設定の「ユーザとグループ」パネルを操作すれば、ログインシェルそのものを変更することも可能だ