📌

WSLでHomebrewとDockerの「そのようなファイルやディレクトリはありません」エラーがでたので直した

に公開

エラーがでたぞ

compinit:503: そのようなファイルやディレクトリはありません: /home/linuxbrew/.linuxbrew/share/zsh/site-functions/_brew_services
compinit:503: そのようなファイルやディレクトリはありません: /usr/share/zsh/vendor-completions/_docker

wslのubuntuに入れてる、zsh再起動したら、なんか突然出てきた。直すぞ!

なんでこうなった?

WSLでHomebrewとDockerを入れると、コマンドの補完機能(タブ押したときに候補が出てくるやつ)のファイルが自動で入るはず。
でも、WSLの場合はシステムのディレクトリに書き込む権限がなかったり、そもそもディレクトリが存在しなかったりして、うまく配置されない。

解決方法

システムのディレクトリじゃなくて、自分のホームディレクトリに補完ファイルを置くようにする。

  1. 補完ファイル用のディレクトリを作る
mkdir -p ~/.zsh/completion
  1. 必要な補完ファイルをダウンロード
# 全部コピペでOK
curl -L https://raw.githubusercontent.com/docker/cli/master/contrib/completion/zsh/_docker -o ~/.zsh/completion/_docker
curl -L https://raw.githubusercontent.com/Homebrew/brew/master/completions/zsh/_brew -o ~/.zsh/completion/_brew
curl -L https://raw.githubusercontent.com/Homebrew/brew/master/completions/zsh/_brew_services -o ~/.zsh/completion/_brew_services
  1. ~/.zshrcに設定を追加
# ここに補完ファイルがあるよって教える
fpath=(~/.zsh/completion $fpath)
# 補完機能を有効化
autoload -Uz compinit
compinit -i
# 見つからない補完は無視
ZSH_DISABLE_COMPFIX=true
  1. 設定を反映
source ~/.zshrc

なぜこれで直るのか

  • システムのディレクトリではなく、自分のホームディレクトリに補完ファイルを置くから、権限の問題を回避できる
  • fpathに自分のディレクトリを追加することで、zshが補完ファイルを見つけられるようになる
  • ZSH_DISABLE_COMPFIX=trueで、システムディレクトリにある補完ファイルのチェックをスキップする

Discussion