- 投稿日:2020-11-25T20:53:35+09:00
MacOS に Bash 5.0 をインストールする
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 をダウンロードします。3.2 インストール
/usr/local/bin/bash
がすでに存在している場合は削除してから行ってください。# ダウンロードしたディレクトリに移動します cd ~/Downloads # tar コマンドで解凍します # -x, --extract 解凍(アーカイブファイルからdiskに出力する) # -v, --verbose 詳細出力 # -z, --gzip, --gnuzip gzip形式で解凍(or圧縮) # -f, --file アーカイブファイルの指定(相対パスなので注意!!) tar xvzf bash-5.0.tar.gz # configure Bash for my system # 解凍したディレクトリに移動して cd bash-5.0 # configure ファイルを実行します(微妙に時間がかかります) ./configure # このとき、最適化のために CFLAGS=-O3 を設定してからやってもいいです。 # make コマンドで bash と bashbug をコンパイル make # bash と bashbug をインストール make install # /etc/shells ファイルが使用可能なシェルの一覧を示すので # /usr/local/bin/bash を追加します。 # これをやらないとインストールした Bash 5 ではなく # システムの Bash 3 を起動してしまいます。 sudo echo "/usr/local/bin/bash" >> "/etc/shells"ここまでで
/usr/local/bin/bash
に bash 5.0 がインストールされるはずです。
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 をデフォルトのシェルとして使いたい場合の設定です。
# 現在のユーザのログインシェルを変更します。 # ユーザはオプション -u で指定できます。 chch -s /usr/local/bin/bash # あとはターミナルを再起動したりすればOK # 確認 echo "${BASH_VERSINFO}" # 変更前は3,変更後は5が出力されるはずです。 # 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 のインストール brew install 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 だとこの辺あんま気にしなくてもいいよって後押しあればコメントいただければ幸いです。
- 投稿日:2020-11-25T20:53:35+09:00
MacOS に Bash 5.0.18 をインストールする
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 自体をアンインストールできなかったりすることが考えられます。(2020/11/28 別に Terminal で開くシェルを変えれば大丈夫な気がしてきました)なので今回は 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 になることが多そう。curl -L
?知らない子ですね)ので、とりあえず 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.
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. おわりに
VSCode や JetBrains IDE のデフォルトシェルを /bin/bash から変更することも忘れずに
(参考:https://code.visualstudio.com/docs/editor/integrated-terminal#_configuration
https://pleiades.io/help/idea/settings-tools-terminal.html冒頭で Zsh 推奨とか言っておきながら、Zsh はプラグイン入れたくなるけど入れると重くてイライラしちゃうし() シェルスクリプトは
#!/bin/bash
が多いですし(私も何も考えずにそう書く←おい)Fish に至っては POSIX 非互換ですし?、シェルのくせに互換性を一々確認しないといけないのが面倒(どうせ確認しない)なので、Bash がなかなか手放せません。Zsh だとこの辺あんま気にしなくてもいいよって後押しあればコメントいただければ幸いです。
- 投稿日:2020-11-25T17:05:56+09:00
CatalinaのSIPでRead-only file systemエラーが/usr/領域操作で出てきたとき
前提
こちらでSIPのガードを外していること
初心者向け MacでOperation not permittedの解決方法起こった問題
開発用にlibftd3xx.dylibをコピーしようとしたときのこと。
$ sudo cp libftd3xx.dylib /usr/lib/ Password: cp: /usr/lib/libftd3xx.dylib: Read-only file systemRead-onlyということで結局コピーできない。
どうやって解決したか
Catalinaの問題らしい?
こちらのStackOverflowで回答がありました:Read-only file system" with SIP disabled in macOS Catalina$ sudo mount -uw /
- 投稿日:2020-11-25T12:46:15+09:00
macのルーティングを変更する route add route change
VPNを通したくない通信があるときとかに使う
interface指定
$ sudo route add -host <dest-IP> -interface en0 Password: add host <dest-IP>: gateway en0ルータを指定する版
# route add $ sudo route -n add -net <dest-IP>/32 192.168.0.1デフォゲを全部変えたい版
全部VPN通したいときとかsudo route change default 10.10.20.30このIPはVPN tunnel用のgw的なIPを。
- 投稿日:2020-11-25T12:46:15+09:00
macのルーティングを変更する route add route change route delete
VPNを通したくない通信があるときとかに使う
interface指定
$ sudo route add -host <dest-IP> -interface en0 Password: add host <dest-IP>: gateway en0ルータを指定する版
# route add $ sudo route -n add -net <dest-IP>/32 192.168.0.1デフォゲを全部変えたい版
全部VPN通したいときとかsudo route change default 10.10.20.30このIPはVPN tunnel用のgw的なIPを。
消す時
$ sudo route delete -host $IP -interface en0 delete host $IP: gateway en0
- 投稿日:2020-11-25T09:59:23+09:00
Macで各種ビデオ会議ツールを使うときに画面共有ができないときに確認すること
私の会社では、主に ZOOM や Discord を使ってオンライン会議だったり、オンライン飲み会だったり、オンライン勉強会なんかをやっているのですが、
先日私の画面を共有しながら発表を行おうとしたらうまくいかずにしばらくハマってしまったので忘れないようにメモ。今思えば、以前 Chatwork 使っていたときも似たようなことでハマった気がする。
私ってば、学習しない人ですね。さいしょにまとめ
- 「システム環境設定」から「セキュリティとプライバシー」を開く
- 「プライバシー」タブを開く
- 「画面収録」メニューから画面共有を使いたいアプリにチェックを入れて画面収録を許可する
おきていたこと
- 仕込んでおいた勉強会用スライドをフルスクリーン表示にして、ZOOMやDiscordでその画面を共有しようとしたら、相手にはデスクトップの壁紙しか見えていないという状況になった
- なぜか、ZOOM本体やDiscord本体は見えているし、壁紙だけの画面は配信されているので配信設定の問題ではなさそう
原因
ビデオ通話ツールは自分のデスクトップや特定のアプリの画面をリアルタイムにキャプチャーして参加者と共有できる機能を持つものが多いですが、これらのようにユーザーが意図的に自分のデスクトップ画面を配信するつもりでつかうものだけでなく、世の中には悪意のあるツールなんかも存在しています。
それらが勝手に画面を共有できないように、OS側はアプリのそういった操作をユーザーが明示的に許可しない限り配信できないような仕組みになっているのですね。
はじめて画面共有をしようとしたときにダイアログがでたりすることもあるようですが、事前に仕込んでおかないといざ自分の番になったときに出ても結構わたわたしてて見落としてたりうっかり閉じてしまうこともあるかもしれません。そうなると今回のように何故か画面はキャプチャできてもアプリが見えない状態になってしまうようです。
解決方法
注意1:以降キャプチャが英語版ですが、
これは私が特に意味もなくかっこつけて言語設定を英語にしているだけですのでそんな細かいことは気にしないように。
説明自体は「日本語表示」時の項目名で書いていきますし、最悪枠線つけてる箇所のアイコンだったり、位置関係を見て判断してください注意2:世の中では最新 OS の Big Sur が登場してますが、私はまだアップデートをビビってるためキャプチャ内容は Catalina のものです。
Big Surでもし劇的に画面構成やアイコンが変化していたら…ごめんなさい。1.システム環境設定を開きます。
お好きな方法でどうぞ。
- メニューバーの一番左にある「(リンゴマーク)」をクリック→「システム環境設定」を選択します
- 買ったばかりの Mac なら Dock にもいるかもしれません
- Spotlight から探してもよいでしょう
- Siri にお願いしてもOK
- もちろん、お気に入りのランチャーから立ち上げても大丈夫
2.「セキュリティとプライバシー」をクリックして「セキュリティとプライバシーパネル」を開きます。
ぱっと見つけられない場合は、システム環境設定の右上にある検索窓に「セキュリティ」とかいれるとすぐ見つかるはずです。
3.「プライバシー」タブを開き、左のリストから「画面収録」をクリックします
3.右のリストからビデオ通話アプリを選択
画面収録をクリックすると、画面収録を行う可能性があるアプリ(だと思います)が一覧で出てきますので、使いたいビデオ通話アプリ(キャプチャの例だと ZOOM)の横にあるチェックボックスをオンにします。
これでチェックを入れたアプリで画面共有ができるようになるはずです。
参考