ある日
brew doctor
env: Fusion.app/Contents/Public:...中略... No such file or directory
Homebrew が死んだ。
ググる。
/private/etc/paths.d/com.vmware.fusion.public に書かれているVMwareのパス /Applications/VMware Fusion.app/Contents/Public にスペースが入ってるためシェルに読み込まれる時におかしくなるとのこと。
パーミッションを変更する。
sudo chmod 644 /private/etc/paths.d/com.vmware.fusion.public
管理者権限で何らかのエディタを使い下記のように修正する。
- /Applications/VMware Fusion.app/Contents/Public
+ /Applications/VMware\ Fusion.app/Contents/Public
シェルを再起動し確認する。
exec $SHELL -l
brew doctor
env: Fusion.app/Contents/Public:...中略... No such file or directory
まだ死んでいる。
パスを確認する。
# 改行して見やすくする
echo $PATH | tr ':' '\n'
...中略...
/Applications/VMware\ Fusion.app/Contents/Public
...中略...
/Applications/VMware Fusion.app/Contents/Public
パスが重複して読み込まれている。
ターミナルを開き直してみる。
echo $PATH | tr ':' '\n'
...中略...
/Applications/VMware\ Fusion.app/Contents/Public
重複が消えた。
exec $SHELL -l ではだめだということがわかった。
brew doctor
Your system is ready to brew.
生き返った。
だがしかし。
VMware を起動すると com.vmware.fusion.public が元に戻ってしまった。
また Homebrew が死んだ。
ググる。
答えに行き着く。
.zshrc に書いていた alias brew="env PATH=${PATH/~\/\.anyenv\/envs\/pyenv\/shims:/} brew" に /Applications/VMware Fusion.app/Contents/Public が読み込まれたときにスペースをエスケープすれば良いとのこと。
そもそもこの alias は何かというと pyenv を使って Python をインストールすると brew doctor した時に以下のような Warning が出る。
brew doctor
Warning: "config" scripts exist outside your system or Homebrew directories.
`./configure` scripts often look for *-config scripts to determine if
software packages are installed, and which additional flags to use when
compiling and linking.
Having additional scripts in your path can confuse software installed via
Homebrew if the config script overrides a system or Homebrew-provided
script of the same name. We found the following "config" scripts:
/Users/<USER NAME>/.anyenv/envs/pyenv/shims/python3.7-config
/Users/<USER NAME>/.anyenv/envs/pyenv/shims/python3.7m-config
/Users/<USER NAME>/.anyenv/envs/pyenv/shims/python-config
/Users/<USER NAME>/.anyenv/envs/pyenv/shims/python3-config
意味は Homebrew の管轄外(pyenv以下)に config ファイルがあると混乱するよ。といった感じ。
これを避けるために brew コマンドを実行したときに env PATH=${PATH/~\/\.anyenv\/envs\/pyenv\/shims:/} でパスから /pyenv/shims を削除し何も見なかったことにしてもらう。
で、この処理をする時にスペースが入ったパスが展開されるとエラーを引き起こす。
なので下記の様に修正。
- alias brew="env PATH=${PATH/~\/\.anyenv\/envs\/pyenv\/shims:/} brew"
+ alias brew="env PATH=\"${PATH/~\/\.anyenv\/envs\/pyenv\/shims:/}\" brew"
ターミナルを開き直して確認する。
brew doctor
Your system is ready to brew.
生き返った。
えらい回り道をしてしまった。
参考というか答えそのもの: 【Tips】VMware Fusion 10を使用するとパスがおかしくなる問題の解決法【完全版】 | ソフトアンテナブログ
まとめ
- VMware を使い pyenv を使い
brew doctorの Warning を回避する alias を使っている時に brew コマンドを実行すると Homebrew は死ぬ - alias でパスが展開されるところでスペースをエスケープしてやれば Homebrew は生き返る
-
exec $SHELL -lはパスが重複して読み込まれちゃう - はじめからしっかりググろう