Moving to zsh
Apple は macOS 10.15 Catalina のデフォルトシェルを zsh
.
このシリーズでは、bash
設定、構成、スクリプトを zsh
.
- へ移行した経験を記録します
- パート1: zsh への移行 (この記事)
- Part 2: 設定ファイル
- Part 3: シェルオプション
- Part 4: エイリアスと関数
- Part 5: 完了
- Part 6:
zsh
プロンプトをカスタマイズ - Part 7: 細かい点
- Part 8: 設定とファイル。 スクリプト
zsh
zsh
(ジーシェルと発音すると思いますが、ジーシュと言うのも面白いですね) は bash
を継承してデフォルトシェルとなります。 bash
は Mac OS X 10.3 Panther 以降のデフォルトのシェルです。
このシリーズは、より詳細でトピックに満ちたものに作り変えられ、1冊の本となりました。 他の書籍と同様に、リリース後も更新と追加を行い、適切で使いやすいものにする予定です。 現在、Apple Books Store で注文できます。
なぜ?
macOS にバンドルされている bash
バイナリは、これまで長い間、バージョン 3.2 で止まっていました。 bash
v4は2009年に、bash
v5は2019年1月にリリースされました。 Appleがこれらの新しいバージョンに切り替えない理由は、GPL v3でライセンスされているためです。 bash
v3はまだGPL v2です。一方、
zsh
は「MITライク」ライセンスで、Appleがデフォルトでシステムに組み込むには、より好都合なものとなっているのです。 zsh
は長い間 macOS 上で利用可能でした。 macOS 10.14 Mojave の zsh
のバージョンはかなり新しく (5.3) 、macOS 10.15 Catalina は現在の zsh
5.7.1.
bash はなくなったのか!
No.
macOS Catalina には Mojave や以前の macOS バージョンと同じ /bin/bash
(バージョン 3.2.57) がまだ搭載されています。 この変更は、macOS Catalinaで作成された新規アカウントにのみ適用されます。 Catalina にアップグレードしても、ユーザーのデフォルトのシェルは以前のままです。
macOS や管理システム、Apple やサード パーティのインストーラーにある多くのスクリプトは /bin/bash
に依存しています。 もし Apple が macOS 10.15 Catalina、あるいは 10.16 でこのバイナリをヤンクしてしまったら。
Catalina のデフォルト シェルとして /bin/bash
を使用しているユーザーは、各ターミナル セッションの開始時に、zsh
が現在推奨されているデフォルト シェルであることを示すプロンプトが表示されるでしょう。 もし /bin/bash
を使い続けたいのであれば、.bash_profile
または .bashrc
で環境変数を設定することにより、このメッセージを表示しないようにすることができます。
export BASH_SILENCE_DEPRECATION_WARNING=1
bash の新しいバージョンを自分でダウンロードしインストールすることもできます。 カスタム bash のインストールは別のディレクトリ、通常は /usr/local/bin/bash
.
bash はいつまでも残るのでしょうか。
Apple はシェルを切り替えるよう強く勧めています。 これは、Mac OS X 10.3 Panther での最後の切り替えとは異なっており、Apple はデフォルトを bash
に切り替えましたが、あなたが tcsh
のままであっても特に気にしませんでした。 実際、tcsh
はまだ macOS に存在しています。
Apple のメッセージは、/bin/bash
の時代が終わりつつあることを私たちに教えてくれるはずです。 おそらくすぐにではありませんが、いずれは 10 年以上前のバージョンの bash
をシステム上に維持することは、負債に変わるでしょう。 組み込みのbashは、「Shellshock」脆弱性を緩和するために、2014年にパッチを適用しなければなりませんでした。 ある時点で Apple は、継続的なメンテナンスのコストが高すぎると考えるでしょう。
もうひとつの手がかりは、macOS Catalina に新しいシェルが登場したことです(サポート記事でも触れられています)。 Debian Almquist Shell」dash
がシェルのラインナップに追加されました。 dash
はPosix標準シェルsh
の最小限の実装として設計されています。 これまでのところ、(Catalina を含む) macOS では、sh
は bash
を sh
互換モードで呼び出します。
Apple のサポート記事にあるように、Catalina はユーザーと管理者が sh
呼び出しを処理するシェルを変更する新しいメカニズムも追加しています。 Mac 管理者やユーザーは、/var/select/sh
に格納されているシンボリックリンクを変更して、/bin/bash
以外のシェルを指すようにすることができます。 これにより、#!/bin/sh
shebang や sh -c
で起動されたスクリプトをどのシェルが解釈するかが変更される。 sh
のインタプリタを変更することは望ましくないが、システム、管理ツール、インストーラのいくつかの重要なスクリプトの動作を変更するかもしれないが、テスト目的には非常に有用であろう。
これらの変更はすべて、Apple が将来のまだ不確定な時点で /bin/bash
を削除する準備をしていることを示す指標です。
Catalina が zsh に切り替えるのを待つ必要がありますか。
いいえ、zsh
は Mojave と古い macOS バージョンで利用できます。 zsh
のテストを開始したり、デフォルトのシェルを切り替えることもできます。
zsh
の動作を確認したい場合は、ターミナルを開いて zsh
:
$ zshMacBook%
と入力してください。 zsh
はデフォルトのプロンプトとして %
文字を使用します。 (もちろん変更可能です。) ほとんどのナビゲーションキー操作やその他の動作は、bash
と同じままです。 このコマンドは現在のシェルを変更するのではなく、すべての新しいシェルを変更するので、現在のターミナルウィンドウとタブを閉じて、新しいものを開いてください。
bash
(‘Bourne again shell’) と同様、zsh
はシェルの ‘Bourne’ ファミリーから派生しています。 この共通の祖先のため、日常的な使用では非常に似た挙動をします。 最も明らかな変化はプロンプトが異なることである。
bash
と zsh
の主な違いは設定である。 zsh
は bash
の設定ファイル (.bash_profile
または .bashrc
) を無視するので、カスタマイズした bash の設定を単純に zsh
にコピーすることはできない。 zsh
には、zsh
の設定や動作を変更するためのオプションやポイントがより多く用意されています。
zsh
はまた、bash
よりもはるかに簡単なオートコンプリートのためのより良い設定を提供しています。
スクリプトについてはどうでしょうか。
zsh
は長い間 macOS に存在しているので、スクリプトを bash
から zsh
にすぐに移行しても、下位互換性を失うことはないでしょう。 スクリプトの shebang を #!/bin/zsh
に設定することだけは忘れないでください。
zsh
が bash
v3 より優れているいくつかの機能、たとえば配列や連想配列 (辞書) を利用できるようになります。 これは、ベータ版またはそれ以降に変更される可能性がありますが、zsh
が確実に Recovery に存在しない古い macOS インストールを考慮しなければなりません。
Twocanoes MDS や installr、bootstrappr などの Recovery (または NetInstall、ブータブル USB ドライブ)コンテキストでのインストール スクリプトやパッケージを使用しようとしている場合、/bin/zsh
には頼れないのです。
bash
が最終的になくなることが分かっているので、残された唯一の一般的な選択肢は /bin/sh
です。
インストーラパッケージを構築するとき、それが展開されるかもしれないすべてのコンテキストを予想するのは難しいかもしれません。 そのため、インストール前後のスクリプトには、今後 /bin/sh
を使用することをお勧めします。
私は以前、MacAdmin 関連のすべてに /bin/bash
を使用することをお勧めしていました。 /bin/sh
は確かに機能的には一歩落ちますが、サポートを継続するには最も安全な選択だと思います。
まとめ
全体として、Apple からのメッセージは非常に興味深いものですが、変更自体は見出しほど劇的ではありません。 Apple は、少なくともまだ、bash
を zsh
に「置き換え」ているわけではありません。 全体として、私たちはいくつかのことを再考し、学び直さなければなりませんが、10 年前のシェルから新しいモダンなシェルに最終的に切り替えることで得られるものも多くあります!
Next
次のパートでは、zsh
.
の設定ファイルを見ていきましょう。