Quantcast
Channel: Bashタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 2802

MacOS に Bash 5.0.18 をインストールする

$
0
0

1. はじめに

OS X Catallina 以降、デフォルトのログインシェルは Zsh です。いくつか非互換な標準設定はあるものの、こだわりがなければ Zsh に乗り換えるのをおすすめします。
(参考:bashとzshの違い。bashからの乗り換えで気をつけるべき16の事柄

また,Apple はライセンスの問題から Bash のバージョンを上げていないので、macOS にはじめから入っている Bash (version 3.2.x) はとても古く、脆弱性(参考:2014年シェルショック問題 - WikipediaCVE-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 ダウンロード

curlwgetを使ってもよいのですが、一番近いミラーサイトとか知らない(日本だと JAIST か JRE になることが多そう)ので、とりあえず GNU Bash のホームページ的なサイト:Bash - GNU Project - Free Software Foundationを見に行って、ブラウザから bash-5.0.tar.gz をダウンロードします。

ミラーサイトを使う.png

bash-5.0.tar.gzをダウンロード.png

これでミラーサイトも確認できたので、同じサイトからパッチもダウンロードします。

# 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 がインストールされるはずです :tada:

/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.

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

具体的に何に使われているかコードを追う気力はなかったので、雑にシンボリックリンクを張って実行しました。(あまり詳しくないのでGCCのバージョンや、GCCのふりをしたclangにやられたりしました。気をつけてください)

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 だとこの辺あんま気にしなくてもいいよって後押しあればコメントいただければ幸いです。


Viewing all articles
Browse latest Browse all 2802

Trending Articles