お久しぶりです
色々ありまして、M1MacBook Airを頂きました
えー
流さんからMacBookAir(M1,8G,256G)を頂きました pic.twitter.com/BBPJMjJcYL— じんさん@ zin3– (@uesitananame55) January 3, 2021
また、だいぶ前に買った自作キーボードのキットを組んだ際に色々詰まったので備忘録として残しておきます
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の導入
- ターミナル.appをRossettaを使用して起動
- homebrewを公式サイト指定のスクリプトで導入(
/usr/local/bin/brew
にインストールされる) - 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まとめを御覧ください。
設定ファイル
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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="%n@%m(`uname -m`) %~ %# " | |
# NVM | |
export NVM_DIR="$HOME/.nvm" | |
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"# This loads nvm |
全体としてはこちらのとおりです。
ざっくり解説すると
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
と起動したシェルを終了します。
まとめ
素直にターミナルアプリ分けとけ
参考








コメント