1. はじめに
OS X Catallina 以降、デフォルトのログインシェルは Zsh です。いくつか非互換な標準設定はあるものの、こだわりがなければ Zsh に乗り換えるのをおすすめします。
(参考:bashとzshの違い。bashからの乗り換えで気をつけるべき16の事柄)
また,Apple はライセンスの問題から Bash のバージョンを上げていないので、macOS にはじめから入っている Bash (version 3.2.x) はとても古く、脆弱性(参考:2014年シェルショック問題 - Wikipedia、CVE-2014-7169(←直ったと思ったら直ってなかったやつ)に関してパッチがあたっていたとしても、あまり使いたいものではありません。もしパッチがあたっていなかったとしても /bin/bash
を直接書き換えるのはやめましょう。
それから、Homebrew 経由でシェルをインストールした場合、Homebrew に不具合が起きた場合にシェルが使えなってどうしようもなくなったり、Homebrew 自体をアンインストールできなかったりすることが考えられます。なので今回は Homebrew を使わずに Bash をインストールしていきたいと思います。
(参考:MacOSでbash 4.4.xを最終版にする【重要】 - Qiita)
2. 参考:Homebrew 経由で Bash をインストールする
前述の理由によりおすすめはしませんが、一応。
# まず Bash 5 を /usr/local/Celler/bash にインストールして# /usr/local/bin/bash にリンクを張るります。# "/usr/local" は ${brew --prefix} の値です。
brew install bash
# 次に、/etc/shells ファイルが使用可能なシェルの一覧を示すので# /usr/local/bin/bash を追加します。echo"/usr/local/bin/bash"> /etc/shells
# 最後に、現在のユーザのログインシェルを変更する。# ユーザはオプション -u で指定できる。
chch -s /usr/local/bin/bash
# あとはターミナルを再起動したりすればOK# 確 認echo"${BASH_VERSINFO}"# 変更前は3,変更後は5が出力されるはずです。# bash --version だと、ログインシェルではなく# /usr/local/bin/bash のバージョンを表示してしまうので注意!
3. Homebrew を使わずに Bash をインストールする
3.1 ダウンロード
curl
や wget
を使ってもよいのですが、一番近いミラーサイトとか知らない(日本だと JAIST か JRE になることが多そう)ので、とりあえず GNU Bash のホームページ的なサイト:Bash - GNU Project - Free Software Foundationを見に行って、ブラウザから bash-5.0.tar.gz をダウンロードします。
これでミラーサイトも確認できたので、同じサイトからパッチもダウンロードします。
# bash-5.0.tar.gz ダウンロードしたディレクトリに移動します。cd ~/Downloads
# tar コマンドで解凍します。# -x, --extract 解凍(アーカイブファイルからdiskに出力する)# -v, --verbose 詳細出力# -z, --gzip, --gnuzip gzip形式で解凍(or圧縮)# -f, --file アーカイブファイルの指定(相対パスなので注意!!) tar xvzf bash-5.0.tar.gz
# パッチファイルを curl コマンドでダウンロードして# パイプで patch コマンドに渡してパッチする
curl "https://ftp.jaist.ac.jp/pub/GNU/bash/bash-5.0-patches/bash50-[001-018]" | patch -p0# [001-018] の部分は現在出されているパッチをみて変えます
これで Bash 5.0.18 のダウンロードが完了しました。
3.2 インストール
/usr/local/bin/bash
がすでに存在している場合は削除してから行ってください。
# パッチをあてたディレクトリに移動します。cd ~/Downloads/bash-5.0
# configure ファイルを実行します(微妙に時間がかかります)
./configure
# このとき、最適化のために CFLAGS=-O3 を設定してからやってもいいです。# make コマンドで bash と bashbug をコンパイル
make
# bash と bashbug をインストール
make install
ここまでで /usr/local/bin/bash
に Bash 5.0.18 がインストールされるはずです
/usr/local/bin/bash --version
GNU bash, バージョン 5.0.18(2)-release(x86_64-apple-darwin20.1.0)
Copyright (C) 2019 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.
私はこの どうもこの 具体的に何に使われているかコードを追う気力はなかったので、雑にシンボリックリンクを張って実行しました。(あまり詳しくないのでGCCのバージョンや、GCCのふりをしたclangにやられたりしました。気をつけてください)fatal error: libintl.h: No such file or directory が出たら
make install
で次のようなエラーが出ました。In file included from ../../bashintl.h:30,
from seq.c:32:
../../include/gettext.h:27:11: fatal error: libintl.h: No such file or directory
27 | # include <libintl.h>
| ^~~~~~~~~~~
compilation terminated.
make[1]: ***[seq.o] Error 1
make: [install] Error 2 (ignored)
<libintl.h>
は i18n用のライブラリ "gettext.h"
で呼ばれているようです。
(参考:GNU gettext utilities: lib/gettext.h)ln-s /usr/local/includes/libintl.h ./includes/
make install
make install
コマンドは /usr/local/includes/
ではなく、bash-5.0/includes
の中にあるヘッダファイルを参照しているので、応急処置です。
3.3 Bash をデフォルトのシェルに設定する
これは Bash をデフォルトのシェルとして使いたい場合の設定です。
# /etc/shells ファイルが使用可能なシェルの一覧を示すので# /usr/local/bin/bash を追加します。# これをやらないとインストールした Bash 5 ではなく# システムの Bash 3 を起動してしまいます。sudo echo"/usr/local/bin/bash">>"/etc/shells"# 現在のユーザのログインシェルを変更します。# ユーザはオプション -u で指定できます。
chch -s /usr/local/bin/bash
# あとはターミナルを再起動したりすればOK# 確認echo"${BASH_VERSION}"# 変更前は 3.2.57(1)-release あたり、# 変更後は 5.0.18(2)-release が出力されるはずです。# bash --version だと、ログインシェルではなく# /usr/local/bin/bash のバージョンを表示してしまうので注意が必要です!
タブ補完
せっかく Bash4.4 以上に上げたので、タブ補完機能も使いたいですよね。ただし、Homebrew でインストールできる bash-completion
は Bash 3.2 以前にのみ対応なので、Bash 4.1 以降に対応した bash-completion@2
を使います。
# Homebrew のアップデート
brew update
# bash-completion@2 のインストール# --ignore-dependencies で Homebrew の bash をインストールしないようにする。
brew install--ignore-dependencies bash-completion@2
# .bashrc でインタラクティブシェル起動時に実行ファイルを読み込むecho'[[ -r "/usr/local/etc/profile.d/bash_completion.sh" ]] && \'>> ~/.bashrc
echo' . "/usr/local/etc/profile.d/bash_completion.sh"'>> ~/.bashrc
インストール時は .bash_profile
に書けと出てきますが、ログインシェルであってもインタラクティブシェルでなければ補完機能は使わないので、.bashrc
に書きます。bash_completion.sh
でも PS1
が存在しないときは実行しないようになっていますが、それならはじめから .bashrc
に書けばよいです。
あと私は Bash 以外にもシェルを使うので .bash_profile
では .profile
と .bashrc
を読み込むだけにしています。
(参考:Linux: .bashrcと.bash_profileの違いを今度こそ理解する)
4. おわりに
冒頭で Zsh 推奨とか言っておきながら、Zsh はプラグイン入れたくなるけど入れると重くてイライラしちゃうし() シェルスクリプトは #!/bin/bash
が多いですし(私も何も考えずにそう書く←おい) Fish に至っては POSIX 非互換ですし🍣、シェルのくせに互換性を一々確認しないといけないのが面倒(どうせ確認しない)なので、Bash がなかなか手放せません。
Zsh だとこの辺あんま気にしなくてもいいよって後押しあればコメントいただければ幸いです。