WWDC 2019において、AppleはmacOS Catalinaと呼ばれるデスクトップOSの次期バージョンなど多数の新プロダクトを発表した。macOS Catalinaでは、新規に作成したアカウントのデフォルト・コマンドラインシェルがbashからzshに変わる予定だ。
その決定の根拠について、Appleは説明しなかった。Bashは非常に人気のあるUnixシェルであり、少なくともこれまで、ほとんどのLinuxディストリビューションおよびmacOSバージョンのデフォルト・ログインシェルになっていた。実のところ、執筆時点のmacOS安定版であるmacOS 10.14.5には、2007年にリリースされたbash 3.2.57が入っている。したがって、bash自体は何年も進化し続けて、2019年初めにはバージョン5.0になっているのに、macOSではこの10年以上、凍結されてきたということだ。
これが望ましくない理由はたくさんある。バージョン3.2のままだと、バージョン4、5とbashに施されてきたバグ修正と機能強化の恩恵を得ることはできない。明確に言うと、bash 4には、連想配列、プログラマブル自動補完、新しい**
globオペレータ、各種構文ショートカットのサポートが含まれている。bash 5には、いくつかの新しい環境変数、履歴管理の改善、スコープを越えるローカル変数値の継承が導入されている。また、こうした古いソフトウェアを動かすことの大きな問題は、セキュリティだ。とりわけ悪名が高いことに、bashは数年前、リモートコード実行に対して脆弱性があることが明らかになった。研究者は環境変数に関数を定義できるというbashの機能を利用することで、リモート攻撃を成功させた。その際、Appleは他のOSのメンテナーらと共に、速やかに自らのOSにパッチをリリースしたが、10年以上前のプログラムを特にネットワーク環境で動かすことによるセキュリティ上の影響は、まだはっきりしない。幸運なことに、MacPortsやHomebrewといったパッケージ管理ツールのおかげで、bashを最新バージョンにアップグレードする選択肢は常に提供されている。もちろん、公式の配布物から手動でビルドすることも可能だ。
そういうわけで、bash 3.2を新しいものに変えることは、確かに良い決定だ。唯一の疑問は、なぜAppleはbash 5ではなくzshに切り替えることを選んだのかだ。これについては何人かの人が推測しているように、bashのライセンスモデルに起因するものだと推測できる。簡単に言うと、bashはバージョン4からGPL 3を採用したが、zshはより寛容なMITライセンスを採用している。この仮説は、macOSがbash 3.2に留まっている理由も説明してくれる。実のところ、AppleはmacOSに、GPL 3ライセンスのソフトウェアを一切入れておらず、デスクトップOSにGPLライセンスのソフトウェアを含めないことが知られている。こうしたポリシーは、その禁止条項によりGPL 3と戦ってきたビジネス環境にフィットするものであり、また、何年も前に彼らがオープンソースソフトウェアに大きく貢献し始めて、多くの企業によって加速されてきたGPLからもっと寛容なライセンスへという一般的なトレンドにもフィットするものだ。
ユーザーの観点から見ると、zshとbashはどちらもBourne shellから派生しており似ていないわけではないが、非互換なところが多数存在する。これらは実行ファイルとして動かすスクリプトには影響しないだろう。スクリプトはshebang(例えば、#!/bin/bash
)、あるいはより正しい#!/usr/bin/env bash
)で指定したシェルで動作するためだ。しかし、bashスクリプトをzshに食わせようとしたり(例えば、. ./script.sh
)、zshで明示的に実行しようとすると(例えばzsh script.sh
)、間違いなく問題になる。いずれにせよもっとも重要なのは、.bashrc
を.zshrc
に移植するのには労力を要することだ。プロンプト設定、補完機能、シェルオプションは特にそうだろう。
もちろん、システム環境設定 > ユーザとグループに進み、ユーザのところでCtrl+クリックで詳細オプション...を選択することで、既存のmacOSユーザーアカウントのログインシェルを変更することもできる。あるいは、/etc/shells
にあるシェルのパスを指定して、コマンドcsh -s /bin/zsh
を実行することも可能だ。