読者です 読者をやめる 読者になる 読者になる

【Homebrew】brew doctorのWarning対処方法 (その3) + envコマンドについて

Homebrew Unix / Linux
スポンサーリンク

Homebrewはすごい便利なんですけどよくWarningに悩まされてる気がします。今回は先日インストールした pyenv が原因のようです。

Warningの内容

内容としてはHomebrewの管理外な*-configファイルがあると衝突おこすかもよという警告みたいです。確かに.pyenv以下はHomebrewでインストールしてるものではないですからね。これがどのように使われるのかは分かりませんが対処して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 what 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/tasukujp/.pyenv/shims/python-config
  /Users/tasukujp/.pyenv/shims/python2-config
  /Users/tasukujp/.pyenv/shims/python2.7-config
  /Users/tasukujp/.pyenv/shims/python3-config
  /Users/tasukujp/.pyenv/shims/python3.4-config
  /Users/tasukujp/.pyenv/shims/python3.4m-config

対処方法を調べるとすばらしい解決策が見つかりましたので参考にさせていただきました。

 homebrew - phpenv入れてる時brew doctorしたら出るWarning消した - Qiita

内容としてはこれだけです。.bash_profileに alias を追加します。

echo 'alias brew="env PATH=${PATH/\/Users\/tasukujp\/\.pyenv\/shims:/} brew"' >> .bash_profile 

再起動してbrew doctorで再度確認。

$ brew doctor
Your system is ready to brew.

対処内容の説明

これだとコピペしただけになってしまうので、何をやってるのかという説明を追加しておきます。しかし、これ考えた人のようにスマートなやり方が出来るようになりたいですね。

まず、やってる事としては brew コマンド実行前に PATH から~/.pyenv/shimsを削除して実行させています。こうする事でWarningの原因である*-configファイルがパスの通ってない状態になるわけですね。

ただし本当に PATH から削除してしまうとその後が困りますのでenvコマンドが使われてます。

envの使い方

env は実行するコマンドに対して環境変数を一時的に設定してくれるものです。オプション無しで env 単体を実行すると環境変数の一覧が出力されます。

基本的な構文と今回の対処内容は次の通りです。[option]は使ってません。

$ env [option] [name=value] [command]

$ env PATH=${PATH/\/Users\/tasukujp\/\.pyenv\/shims:/} brew

brew コマンドの alias に env を設定する事で一時的に PATH から~/.pyenv/shimsを削除した後に brew コマンドを実行してくれます。そのため、実行後の PATH を確認しても~/.pyenv/shimsは消えていません。

$ brew doctor
Your system is ready to brew.
$ echo $PATH
/Users/tasukujp/.nodebrew/current/bin:/Users/tasukujp/.pyenv/shims:/Users/tasukujp/.rbenv/shims:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

 Linuxコマンド集 - 【env】環境を変更してプログラムを実行する

PATHの消し方

どうやって PATH から~/.pyenv/shimsだけを削除しているのかというとシェルの変数展開が使われています。次の部分です。

${PATH/\/Users\/tasukujp\/\.pyenv\/shims:/}

知らない人が見ると意味不明な一文だと思いますが、基本構文は次のようになっており、変数の <pattern> に一致する部分が <string> に置換されます。

${変数/<pattern>/<string>}

今回の場合は <pattern> しか書かれていませんが、<string> が省略されると <pattern> にマッチした部分は削除されるため、このような使い方ができます。ちなみに\(バックスラッシュ)はPATHの/を認識させるためにつけられています。