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まとめを御覧ください。

 

設定ファイル

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

ざっくり解説すると

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,…
Mac M1(Apple Silicon)でhomebrewをインストールできるの? - Qiita
今まで通りにインストールしようとしたら...現状、ターミナルから今まで通りhomebrewをインストールしようとするとこのような出力が表示されます。(curl …
Apple SiliconにおけるHomebrewのベストプラクティス - Qiita
開発環境としてのApple SiliconみなさんApple SiliconなMac mini/Macbook Air/Macbook Proは買いましたか?DockerやVirtualBoxが…
シェル変数と環境変数の違いをコマンドラインで確認する - Qiita
最近、調べ直したので、この機会にまとめておきます。はじめにシェル変数は現在実行中のシェルだけで有効な変数ですが,環境変数はシェルから実行したコマンドにも引き継がれる変数です。再入門 体で覚える…

コメント