はじめに
Homebrewは、M1 Mac/Intel Mac/Linux(WSL)の3種類で、
インストール先のパスが違います。
.zshrc
の設定をGitコミットして各マシンで共有してるときに、この違いが都合悪いので、自動判定できるようにしました。
結果
こんな感じ。
.zshrc
if [[ -d '/home/linuxbrew/.linuxbrew' ]]; then
# Linux/WSL
HOMEBREW_HOME='/home/linuxbrew/.linuxbrew'
elif [[ -d '/opt/homebrew' ]]; then
# M1 Mac
HOMEBREW_HOME='/opt/homebrew'
else
# Intel Mac
HOMEBREW_HOME='/usr/local'
fi
eval "$($HOMEBREW_HOME/bin/brew shellenv)"
めっちゃそのまんまですが、ディレクトリの存在チェックをして、しかるべきパスのbrew
コマンドを叩きます。
Linux/M1 Macはどっちを先に判定しても良いんですけど、Intel Macは最後のelse
に持ってきたほうが良い。/usr/local
ディレクトリは必ず存在しますからね。
余談: unameは使わないほうが良い
最初はuname
コマンドでこんな風に書いてました。しかし、これだとM1 Macでうまく動かないことがあります。
.zshrc
if [[ `uname` == 'Linux' ]]; then
# Linux/WSL
HOMEBREW_HOME='/home/linuxbrew/.linuxbrew'
elif [[ `uname` == 'Darwin' && `uname -m` == 'arm64' ]]; then
# M1 Mac
HOMEBREW_HOME='/opt/homebrew'
else
# Intel Mac
HOMEBREW_HOME='/usr/local'
fi
eval "$($HOMEBREW_HOME/bin/brew shellenv)"
Macの場合、ターミナルアプリの「情報を見る」で、「Rosettaを使用して開く」のチェックを入れると、Rosettaを使ってIntelアーキテクチャとしてターミナルを開いてくれます。
Rosettaで開いた場合、uname -m
の結果もarm64
ではなくx86_64
となり、Intel Mac判定となります。
しかしHomebrewのインストール先は同じマシンなので一緒なので、「/usr/local/bin/brew
なんて見つからねーよ!」となるわけです。
CLIアプリもまだまだM1対応してないものは多いので、Rosettaを使うこともある場合は、素直に「インストール先ディレクトリが存在するか」でチェックしたほうが安全です。