macユーザーがお世話になっているであろうbrewコマンドで起きていた、害はないが目障りだった問題を解決していく。
発生していた問題
安価で高性能と評判のM1macを使い始めて早半年、こまめに更新しないと気がすまない私は、毎度のごとくiTerm2(terminal)を開き
brew update
brew upgrade
を実行した。すると・・・
/opt/homebrew/bin/brew: line 27: readlink: command not found
/opt/homebrew/bin/brew: line 28: dirname: command not found
また君か
hogehoge: command not found
私の環境ではreadlink
とdirname
がcommand not foundと表示されているが、似た問題が発生している方は、もしかしたら異なる単語が乗っているかもしれない。
brewコマンドを叩くたびに毎度毎度出てくるこれらの文は、何か問題を起こすわけではないものの、視覚的に非常に鬱陶しい存在であった。問題が起きないというのも、それはそれで怖い。
しかし、毎度毎度出てくるこの文を削除しようとggってはみたものの、出てくる事例は『homebrewそのものが見つからないの?そんなときはPATHを通しましょうね☆』というものばかりであった。ちゃうねん。
シェルスクリプトに慣れていない私にとって、zshではなくbashについての記事ばかりだったのも解決へのモチベ低下の原因だった。
原因となる場所すらいまいちわからず、「homebrewそのものに問題があるのか」「.zshrcで変なものが混じっているのか」「iTerm2の設定で何かやらかしたのか」など悶々していたが、まとまった時間の取れる正月に無事解決できたので、忘れないようにメモしていく。
解決策
結論から言うと、.zshrcファイルの記述内容に問題があった。
alias brew="PATH=/opt/homebrew/bin:/opt/homebrew/sbin brew"
alias brew="PATH=/opt/homebrew/bin:/opt/homebrew/sbin:$PATH brew"
お気づきいただけただろうか?
aliasでbrewの呼び出し宣言時に、読み込むPATHの中に$PATH
がないのがいけなかったらしい。ここ以前では$PATH
の宣言をしていないのに・・・
根本の原因は不明だが、ひとまずここで$PATH
を再帰的に?読み込むことで、どこかにあったreadlink
とdirname
を見つけてくれたのだろう。
ここに至るまでの過程
brewファイルの中身
まず原因がどこにあるのかを特定しないといけない。
そこではじめに、command not found
の出力に関わっているであろうhomebrewの中身を見ることにした。
githubにて公開されている内容と比較したものの、ローカルで使用しているものとの差異は見られず、brewに問題がないことがわかった。
また、27,8行目あたりをわからないなりに読んでみたものの、27,8行目で呼び出されているreadlinlk
とdirname
はそれ以前で宣言されていないこともわかった。
.zshrcの中身
brewファイル内でreadlink
とdirname
が宣言されていないのであれば、どこか別のファイルから呼び出されているはずである(私がどこかで削除していなければ。もっともhomeディレクトリより下なんて怖くてあまり触らないが)。
そこで.zshrcで定義しているaliasやPATHがまずいのかもしれないと考え、.zshrcの中身を探してみることにした。
しかし怪しそうなところは見つからない。
仕方がないのでバックアップを取り、内容を徐々に削除してbrewコマンドを打つことを繰り返したものの、それでも.zshrcの中身が空になっただけであった。
判明
バックアップから復帰し、とりあえずPATH関係が怪しそうだと見ていったが、それでもわからない。alias定義部分でのPATHで、他のPATH変数で追加されている:$PATH
がくっついていないので、何となく足してみたら解決した。
この記事はcorne cherry v3で書きました。