4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ある日突然HomebrewのCompletion(Tab補完)が効かなくなってしまった。。。という時の対処法

Last updated at Posted at 2023-03-15

:warning: 2023/2/9以前にHomebrewをインストールされた方は同様の症状が発生する可能性が有ります。

事の発端

Homebrewでアップデートを実施した後、突然オプションコマンドのCompletion(Tab補完)が効かなくなりました。最初Bash Completionが壊れてしまったと思っていましたが、他のコマンドでは補完が動作します。症状の一例を以下に示します。

brew_bug.gif

以下の記事に記載が有る通りHomebrewは大幅なアップデートがなされました。その影響でバグが入り込んでいるのでは?と思い、Issueを出してみました。

ところが。。。以下のURLのページがコメントとして返されただけで、Issueは強制的にClosedされてしまいました。結論から述べるとこのページにある設定は必須ですが、これを設定してもCompletionが効かない症状は直りません。。。:scream: :scream_cat:

根本原因分析と対応策の実施

原因を探るため、/opt/homebrew/completions/bash/brewの中身を見てみることにしました。このファイルはHomebrewのためのBash Completionファイルです。原因はどうやら以下の部分(109~112行)の部分が正常に動作していなさそうです。ここではHomebrewコマンドのTab補完時に出力する内容をファイルから読み込んでいます。しかし、HOMEBREW_REPOSITORYという変数はこのファイル中で初期化されずに使われています。環境変数から読み込みを想定しているのかもしれませんが、Homebrewのインストール方法にはその記載は有りません。実は最新版のHomebrewのインストーラーはインストール後に環境変数の追加を求めるメッセージが出力されます。但し、2023/2/9以前にHomebrewを既にインストールしている人にはアップデート時は通知されないため、環境変数が追加されないまま使ってしまっているという状態となってしまうため、正常に動作しなくなります。

elif [[ -n ${HOMEBREW_REPOSITORY:-} && -f ${HOMEBREW_REPOSITORY}/completions/internal_commands_list.txt ]]                                
then
    cmds="$(< "${HOMEBREW_REPOSITORY}/completions/internal_commands_list.txt" \grep -v instal$)"
fi

解決策はハッキリしました。以下の様に.bash_profile追記します。eval "$(/opt/homebrew/bin/brew shellenv)"を追記することで必要な環境変数を全て自動で追加してくれます。今までHomebrewのPATHを自分で追加する必要が有りましたが、不要になりました。序でに利用状況が外部に送信されることを防ぐ環境変数も有効化させて起きます。

.bash_profileへの追記内容
eval "$(/opt/homebrew/bin/brew shellenv)"

export HOMEBREW_NO_ANALYTICS=1
export HOMEBREW_NO_GOOGLE_ANALYTICS=1

if type brew &>/dev/null
then
  HOMEBREW_PREFIX="$(brew --prefix)"
  if [[ -r "${HOMEBREW_PREFIX}/etc/profile.d/bash_completion.sh" ]]
  then
    source "${HOMEBREW_PREFIX}/etc/profile.d/bash_completion.sh"
  else
    for COMPLETION in "${HOMEBREW_PREFIX}/etc/bash_completion.d/"*
    do
      [[ -r "${COMPLETION}" ]] && source "${COMPLETION}"
    done
  fi
fi

シェルを再起動します。以下の方法で再起動します。

exec $SHELL -l

.bash_profileの再読込でも大丈夫です。

. ~/.bash_profile

無事Tab補完が動作する様になりました。

brew_completions.gif

Reference

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?