この通り、macOSのBashはバージョン3.2.57です。
$ /bin/bash --version GNU bash, version 3.2.57(1)-release (arm64-apple-darwin23) Copyright (C) 2007 Free Software Foundation, Inc.
ここにアクセスすると、バージョン4や5がリリースされていることがわかります。
macOSのBashが古いままな背景
macOSのBashが更新されない理由は、Bashのv4以降、GPLv3ライセンスに切り替わったためです。macOSにGPLv3ライセンスのソフトウェアをバンドルするのを嫌って、一部のソフトウェアは廃止されたり置き換えられました。
macOSのシェルについてはデフォルト設定はZSHが使われるようになりました。私も普通に使っていたのですが、仕事ではLinux、クライアントとしてはmacOSを使う手前、シェルを共通化したいなという思いがあり組み込みのBashを使っていたのですが、いかんせん古い故にちょっとしたトラブルがちょこちょこ発生していました。
その中の一つがこれです。macOSのターミナルに文字列をコピペするとまれに「bracketed paste mode」が効いてしまって、余計な文字列が先頭と終わりについてしまうという問題です。
シェルをresetすれば回避できるのですが、Bashをバージョン4以降にすると問題が起きないという情報も見つけました。というわけで、私の中で新しいバージョンのBashへの移行欲が高まりました。
macOSに新しいバージョンのBashを入れる方法
Homebrewで入れる方法、自分でビルドする方法がよく見つかります。 もう一つ見つかるのが、BashをHomebrewでインストールするのはおすすめしないという情報です。
ざっくりまとめると「新しいBashが公開されると新しいバージョンに置き換わるので、新しいBashを常用している場合に設定と存在するバイナリーのバージョン不整合が起こり、そのバージョンのBashはもうなくてシェルが開けない(=環境が壊れる)可能性があるのでおすすめしない」ということみたいです。
というわけで、次のような方法でビルドしてインストールしました。
- まずは公式から最新のバージョンのBashを探します
- 執筆日時点では5.2.15が最新でした。そのため次のようにインストールしました
wget https://ftp.gnu.org/gnu/bash/bash-5.2.15.tar.gz tar xf bash-5.2.15.tar.gz cd bash-5.2.15 ./configure --prefix=/opt/bash-5.2 make sudo make install
- ユーザーのデフォルトのシェルは次のように設定しました
sudo sh -c "echo '/opt/bash-5.2/bin/bash' >> /etc/shells" chsh -s /opt/bash-5.2/bin/bash
- さらに
.bash_profile
に書いてパスを通しました
vi ~/.bash_profile #shell export PATH="/opt/bash-5.2/bin:$PATH" source ~/.bash_profile
以上です。これでBashを置き換えることに成功しました。
元のBashはmacOSからBashが廃止されない限りは/bin
に残り続けます。
$ bash --version GNU bash, バージョン 5.2.15(1)-release (aarch64-apple-darwin23.0.0) Copyright (C) 2022 Free Software Foundation, Inc. ライセンス GPLv3+: GNU GPL バージョン 3 またはそれ以降 <http://gnu.org/licenses/gpl.html> This is free software; you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. $ /bin/bash --version GNU bash, version 3.2.57(1)-release (arm64-apple-darwin23) Copyright (C) 2007 Free Software Foundation, Inc.
...時が15年進みました。
bash completionをインストールする
bashの入力補完機能を有効にするためにbash completionもインストールしておきたいと思います。
これは別に置き換わっても困ることはほぼないと思いますので、Homebrewからインストールします。
bash-completion
がBash 3.2向けで、bash-completion@2
がBash 4.1+向けです。つまり、次のようにインストールして終わりです。
brew install bash-completion@2