M1 Macのzshとhomebrewの話

PC
この記事は約5分で読めます。

お久しぶりです

色々ありまして、M1MacBook Airを頂きました

また、だいぶ前に買った自作キーボードのキットを組んだ際に色々詰まったので備忘録として残しておきます

macOSのシェル

現在ではzshが標準のシェルとして用意されています。

WindowsやUbuntu機ではBashだったので、やや違いに戸惑うことがありましたが、基本的には変わりません。

で、問題になるのはM1チップ特有のarm64とx86_64の選択です。

自作キーボードはArduino Pro Microを書き換えて、自分好みのキーマップにできますが、その書き換えに必要な一部のツールがarm64に対応してません。

よって、x86_64で導入しなくてはなりませんが、同一シェルでやったのが原因でめんどくさいことになりました。

 

よって、arm64とx86_64環境を別のアプリとして分けていれば、あんま関係ない話です。

 

同一シェルでarm64とx86_64を簡単に切り替えれるようにする。

まず、シェルでuname -m と実行すると、実行中のアーキテクチャが表示されます。

M1環境で、Rosettaを使用してなければarm64、使用していればx86_64と表示されます。

前述の通り、一部のプログラムはまだarm64で提供されていませんので、必要に応じて、x86_64に切り替える必要がります。

ただ、正直いちいちFinderのアプリケーションを開き、情報を見るから編集していては正直めんどくさいです。

おそらく一番手っ取り早いのが、ターミナルアプリを分ける方法と、arm64環境からx86_64専用プログラムを起動すると自動的に切り替えられる特性を利用した方法です。

 

前者はそのままですので、後者について説明すると、x86_64環境で、homebrewを使いzshをインストールするとx86_64専用のものが導入されます。これをarm64環境から起動するとzshがx86_64で起動するという流れです。

 

x86_64 zshの導入

  1. ターミナル.appをRossettaを使用して起動
  2. homebrewを公式サイト指定のスクリプトで導入(/usr/local/bin/brew にインストールされる)
  3. homebrewでzshをインストール (/usr/local/bin/brew install zsh)

以降はRossettaを無効にしてください。

 

homebrewが共存できない問題

厳密には、zshのPATH的な問題で、x86_64環境でもhomebrewがarm64版が選択され、シェルスクリプトなどにbrew install xxxxxな記述があると、arm64版を探してしまうという問題です。

別に手動でやるのも悪いとは思いませんが、正直そこらも判別していい感じにやってくれと思ったので、zsh起動時に読み込まれる.zshrcに設定していきます。

もとは.zprofileに設定していましたが、設定ファイルの読み込み順序的に不適切であるとわかり、.zshrcにしました。

詳しくはzshの設定ファイルの読み込み順序と使い方Tipsまとめを御覧ください。

 

設定ファイル

# homebrew
# バックアップ変数に保存されていなければ待避、あればPATHを上書き
if [ ${BREW_BK_PATH:-default} = "default" ]; then
export BREW_BK_PATH=$PATH
else
export PATH=$BREW_BK_PATH
fi
# アーキテクチャに応じてhomebrewのパス変更
if [ `uname -m` = "arm64" ]; then
export PATH=/opt/homebrew/bin:$PATH
export PATH=/bin:$PATH
else
export PATH=/usr/local/bin/brew:$PATH
fi
# zsh settings
setopt hist_ignore_dups
setopt hist_ignore_all_dups
# 履歴共有
setopt share_history
# alias 実行時でも補完する
setopt complete_aliases
## brew active plugins
# -e: file exists, -d: direcotry exists
if type brew &>/dev/null; then
## git
if [ -e "$(brew –prefix)/bin/git" ]; then
export PATH=$(brew –prefix)/bin/git:$PATH
fi
# zsh plugins
if [ -d "$(brew –prefix)/share/zsh-completions" ];then
FPATH=$(brew –prefix)/share/zsh-completions:$FPATH
fi
autoload -Uz compinit
compinit
## zsh autosuggesions
if [ -e $(brew –prefix)/share/zsh-autosuggestions/zsh-autosuggestions.zsh ]; then
source $(brew –prefix)/share/zsh-autosuggestions/zsh-autosuggestions.zsh
fi
## zsh syntax highlighting
if [ -e $(brew –prefix)/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh ]; then
source $(brew –prefix)/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
fi
fi
# alias ls
alias ll='ls -l'
# シェルプロント変更
export PROMPT="%[email protected]%m(`uname -m`) %~ %# "
# NVM
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"# This loads nvm
view raw
.zshrc
hosted with ❤ by GitHub

全体としてはこちらのとおりです。

ざっくり解説すると

3行目から7行目は、設定ファイルが読み込まれる前のPATHを保存しています。また、変数が存在するならその変数を上書きします。(homebrewの切り替えで重複すると何かと問題になるので、PATHの内容を消してしまいます。)

10行目から15行目はアーキテクチャに応じて、読み込むhomebrewを切り替えています。

12行目は基本的にzshをフルパスで起動しているのですが、arm64環境でwhich zshを実行すると、x86_64環境で入れたzshが優先されるようなので入れています。正直なくても変わりません。

19行目から24行目はzshの設定です。どちらの環境でも統一しています。

 

28行目からはhomebrew環境かつそれぞれ導入されていれば読み込まれるようにしています。

30行目から32行目を例にすると、homebrewで導入されているgitが存在すればPATHに追加しています。

どちらの環境でもインストールさえすれば動きますが、シェル起動時に毎度ifを実行することと追加時毎度パスを確認しないといけないのがめんどくさいところですね。

設定ファイルをそれぞれ用意して、環境によって読み込むファイルを切り替えるようにしたほうが良さそうなところもあります。(この場合は、12,13及び14,15行目の間に追加するだけです)

 

58行目のシェルプロント変更はどちらの環境で動いてるのか分かりやすくするため変更しています。

 

ほかはNVMだったりエイリアスなので省略します。

 

使い方

これを設定した環境ではまず、Finderで切り替える必要がありません。

arm64版zsh(ターミナルをそのまま)起動すればarm64版として動きます。

x86_64環境が必要なときは/usr/local/bin/zshと実行すれば切り替えられます。

x86_64環境からarm64に切り替える場合はexitと起動したシェルを終了します。

 

まとめ

素直にターミナルアプリ分けとけ

参考

zshの設定ファイルの読み込み順序と使い方Tipsまとめ - Qiita
設定ファイルの種類と読み込み順序 読み込み順を確かめるには実際に各設定ファイルを作ってそのファイル上でファイル名をechoしてみれば良い ログインシェルの場合(iterm2起動時,SSH,TMUX,SCREENなど含む) ...
Mac M1(Apple Silicon)でhomebrewをインストールできるの? - Qiita
今まで通りにインストールしようとしたら... 現状、ターミナルから今まで通りhomebrewをインストールしようとするとこのような出力が表示されます。 $ /bin/bash -c "$(curl -fsSL
Apple SiliconにおけるHomebrewのベストプラクティス - Qiita
開発環境としてのApple Silicon みなさんApple SiliconなMac mini/Macbook Air/Macbook Proは買いましたか? DockerやVirtualBoxが2020年11月18日時点で...
シェル変数と環境変数の違いをコマンドラインで確認する - Qiita
最近、調べ直したので、この機会にまとめておきます。 はじめに シェル変数は現在実行中のシェルだけで有効な変数ですが,環境変数はシェルから実行したコマンドにも引き継がれる変数です。 再入門 体で覚えるLinuxの基本:ITpro...

コメント