WWDC19の基調講演では、iPadOSや新Mac Proといった世間の注目を集めそうなニュープロダクトの発表があるなかで、macOSにも大きな動きがあった。

次バージョンのmacOSとして今秋リリース予定の「Catalina」では、iTunesを機能/用途別に3分割(?)した「Music」と「Apple TV」、「Podcasts」という新アプリが投入される。ほかにも、iPadをセカンドディスプレイとして利用できる「Sidecar」、紛失/盗難の憂き目にあったMacの位置をオフライン時でも検出できる「Find My」など、目を見張る機能は多い。

そんな王道を行く機能群は他の記事に任せておくとして、当コラムとして追うべきは"Yet Anotherな"フィーチャーだ。Catalinaを語りなと言われる前に、そこのところは念押ししておきたい。

即日公開されたCatalinaベータ版の内容に言及することはできないが(NDAがあるのだ)、AppleのWEBサイトやアプリ(WWDCアプリ)で公開された情報を紹介するぶんには問題ないため、Appleのサポートページで検索すると……いくつかヒット。そのひとつが「デフォルトシェルがzshに変更される」というトピックだ(リンク)。ここで読める情報であればNDAの対象外、堂々と本稿で取り上げることができる。

Mac OS Xから名称変更されたmacOSは、基礎部分がBSD UNIX由来ということもあり、最初のバージョンからUNIXシェルを搭載していた。デフォルトシェルは当初tcsh、v10.3(Panther)のときbashに変更され現在に至るが、Catalinaではそれがzshに替わるというわけだ。

なお、Mojaveの現在でもzshは利用できる。ログインシェルとして使うには、システム環境設定「ユーザとグループ」パネルで詳細オプションを変更するのがスジだが、とりあえず使うならTerminalの環境設定パネル「一般」タブで開くシェルに「コマンド(完全パス)」を選択し、zshのフルパス(/bin/zsh)を入力すればいい。Catalinaでは、そのような作業なしにzshが起動されるようになるはずだ。

  • Appleのサポートページには、Catalinaのログインシェルが「zsh」に変更される情報が掲載されている

  • Mojaveの現在でも、かんたんな操作でzshを利用できる

語り出すと長くなるためざっくりいうと、「zshはbashの(ほぼ)上位互換に位置付けられるシェル」だ。多少の差はあるものの、ログインスクリプトはbashのものをおよそそのまま利用できるし、シェルスクリプトの動作も概ね問題ない(そもそもシェルスクリプトの多くはbashより旧式な「sh」向けに記述されている)。日常の多くの時間をTerminalで過ごしているユーザを除けば、ほとんどのMacユーザには影響しないはずだ。

もっとも、そのまま利用できる/問題ないという表現はだいぶおおらかなもので、細かいことを言い出すと相違点は容易に見つかる。その一例が、配列の仕様だ。まずは、以下のコマンドラインをbashとzshそれぞれで実行してほしい。

$ array=(apple orange peach)
$ for i in `seq 0 3`; do
> echo "array[$i] = ${array[$i]}"
> done;

表示される内容が、bashでは配列が0から始まるのに対し、zshでは1から始まっている。配列を扱うシェルスクリプトでは、この仕様の違いが影響することは少なくないはずだ。zshのログインスクリプトに「setopt ksharrays」と記述するなど対策をとれば、bashと同じ挙動にすることは可能なものの、デフォルトでは違うということは押さえておきたい。

  • デフォルトの配列の詰めかたがbash(左)とzsh(右)では異なる

ログインスクリプトの書式や使い方には注意が必要だ。パスの設定など多くの部分は互換性はあるものの、ファイルは別途用意せねばならず(~/.bashrcなどがそのまま利用されるわけではない)、プロンプトのフォーマットがまるで異なるため、見直しは必須だ。

zshがログインシェルとして起動された場合には、「~/.zshenv」→「~/.zprofile」→「~/.zshrc」→「~/.zlogin」の順にチェックされるため、基本的には「~/.zshenv」を用意することになる。手始めには、bashのものを流用すべく以下のコマンドを実行すればいいだろう。

$ cat cat ~/.bash_profile > ~/.zshenv

プロンプトは、実用性が求められつつも使う本人のこだわりとセンスが現れる部分だ。筆者が長年bashで利用しているものは、1行目に時間とユーザ名@ホスト名とカレントディレクトリを表示し改行するという少々変則的なもので、カラー指定の箇所が一見意味不明だが、「%F{色} ... %f」と記述できるzshではだいぶすっきりする。これでCatalina時代のTerminalも快適に過ごせそうだ。

(bash)
export PS1='\[\e[34m\]\@ \[\e[33m\]\u@\h \[\e[32m\]\w\e[0m\n\$ '

(zsh)
PROMPT='%F{blue}%t%f %F{yellow}%n@%m%f %F{green}%~%f
$ '
  • bashのログインスクリプトをコピーしただけではプロンプトが文字化けしてしまうが(左)、zsh用にかんたんに書き直せる