2023/2/9以前にHomebrewをインストールされた方は同様の症状が発生する可能性が有ります。
事の発端
Homebrewでアップデートを実施した後、突然オプションコマンドのCompletion(Tab補完)が効かなくなりました。最初Bash Completionが壊れてしまったと思っていましたが、他のコマンドでは補完が動作します。症状の一例を以下に示します。
以下の記事に記載が有る通りHomebrewは大幅なアップデートがなされました。その影響でバグが入り込んでいるのでは?と思い、Issueを出してみました。
ところが。。。以下のURLのページがコメントとして返されただけで、Issueは強制的にClosedされてしまいました。結論から述べるとこのページにある設定は必須ですが、これを設定してもCompletionが効かない症状は直りません。。。
根本原因分析と対応策の実施
原因を探るため、/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を自分で追加する必要が有りましたが、不要になりました。序でに利用状況が外部に送信されることを防ぐ環境変数も有効化させて起きます。
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補完が動作する様になりました。
Reference