20201125のMacに関する記事は6件です。

MacOS に Bash 5.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

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

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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

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 自体をアンインストールできなかったりすることが考えられます(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 ダウンロード

curlwget を使ってもよいのですが、一番近いミラーサイトとか知らない(日本だと JAIST か JRE になることが多そうcurl -L?知らない子ですね)ので、とりあえず 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. おわりに

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

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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 system

Read-onlyということで結局コピーできない。

どうやって解決したか

Catalinaの問題らしい?
こちらのStackOverflowで回答がありました:Read-only file system" with SIP disabled in macOS Catalina

$ sudo mount -uw / 
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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を。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Macで各種ビデオ会議ツールを使うときに画面共有ができないときに確認すること

私の会社では、主に ZOOM や Discord を使ってオンライン会議だったり、オンライン飲み会だったり、オンライン勉強会なんかをやっているのですが、
先日私の画面を共有しながら発表を行おうとしたらうまくいかずにしばらくハマってしまったので忘れないようにメモ。

今思えば、以前 Chatwork 使っていたときも似たようなことでハマった気がする。
私ってば、学習しない人ですね。

さいしょにまとめ

  • 「システム環境設定」から「セキュリティとプライバシー」を開く
  • 「プライバシー」タブを開く
  • 「画面収録」メニューから画面共有を使いたいアプリにチェックを入れて画面収録を許可する

おきていたこと

  • 仕込んでおいた勉強会用スライドをフルスクリーン表示にして、ZOOMやDiscordでその画面を共有しようとしたら、相手にはデスクトップの壁紙しか見えていないという状況になった
  • なぜか、ZOOM本体やDiscord本体は見えているし、壁紙だけの画面は配信されているので配信設定の問題ではなさそう

原因

ビデオ通話ツールは自分のデスクトップや特定のアプリの画面をリアルタイムにキャプチャーして参加者と共有できる機能を持つものが多いですが、これらのようにユーザーが意図的に自分のデスクトップ画面を配信するつもりでつかうものだけでなく、世の中には悪意のあるツールなんかも存在しています。

それらが勝手に画面を共有できないように、OS側はアプリのそういった操作をユーザーが明示的に許可しない限り配信できないような仕組みになっているのですね。

はじめて画面共有をしようとしたときにダイアログがでたりすることもあるようですが、事前に仕込んでおかないといざ自分の番になったときに出ても結構わたわたしてて見落としてたりうっかり閉じてしまうこともあるかもしれません。そうなると今回のように何故か画面はキャプチャできてもアプリが見えない状態になってしまうようです。

解決方法

注意1:以降キャプチャが英語版ですが、これは私が特に意味もなくかっこつけて言語設定を英語にしているだけですのでそんな細かいことは気にしないように。
説明自体は「日本語表示」時の項目名で書いていきますし、最悪枠線つけてる箇所のアイコンだったり、位置関係を見て判断してください:bow_tone1:

注意2:世の中では最新 OS の Big Sur が登場してますが、私はまだアップデートをビビってるためキャプチャ内容は Catalina のものです。
Big Surでもし劇的に画面構成やアイコンが変化していたら…ごめんなさい。

1.システム環境設定を開きます。

お好きな方法でどうぞ。

  • メニューバーの一番左にある「(リンゴマーク)」をクリック→「システム環境設定」を選択します
  • 買ったばかりの Mac なら Dock にもいるかもしれません
  • Spotlight から探してもよいでしょう
  • Siri にお願いしてもOK
  • もちろん、お気に入りのランチャーから立ち上げても大丈夫

2.「セキュリティとプライバシー」をクリックして「セキュリティとプライバシーパネル」を開きます。

system_preferences.png

ぱっと見つけられない場合は、システム環境設定の右上にある検索窓に「セキュリティ」とかいれるとすぐ見つかるはずです。

3.「プライバシー」タブを開き、左のリストから「画面収録」をクリックします

security_and_privacy.png

3.右のリストからビデオ通話アプリを選択

画面収録をクリックすると、画面収録を行う可能性があるアプリ(だと思います)が一覧で出てきますので、使いたいビデオ通話アプリ(キャプチャの例だと ZOOM)の横にあるチェックボックスをオンにします。

これでチェックを入れたアプリで画面共有ができるようになるはずです。

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む