下林明正のブログ

個人的かつ雑多なブログです。

Visual Studio CodeのRemote Development拡張でVirtualBoxで動かしているDebianに繋げたけど__git_ps1なんて無いよと怒られたので解消した

最近職場ではVSCodeを使ってて、自宅でも使えるようにしたいなと思って調べていたところ自分の場合は

marketplace.visualstudio.com

という拡張を使うのが良さそうだったので試してみたところ、VSCode上のターミナルで__git_ps1なんて無いよ的なエラーが表示されて気になったので調べて解消しました。

__git_ps1ってどこで定義されてるんだっけ?と思って調べると、どうやらbash_completion.dというディレクトリ内にあるファイルで定義されているらしいということが分かった。

このディレクトリがどこにあるのか find / -type d -name bash_completion.d とかやって適当に眺めてみると、 /etc/bash_completion.d にあることが分かりました。雑に検索すると

Bashなどsh系のシェルをお使いであれば、 端末を起動したりログインしたときに「/etc/profile」が実行され、 さらに「/etc/profile.d/」以下のスクリプトが実行されるようになっています。 で、そこにある「bash_completion.sh」が、 「/etc/bash_completion」や「/usr/share/bash-completion/bash_completion」 という長いスクリプトを実行し、有無を言わさず補完の機能を拡張します。

ということでした。 ここで、そういえば以前 .bash_profile が読み込まれたり読み込まれなかったりしたことがあったな……と思って嫌な予感がしたので調べてみたところ、

ログインシェルでない対話的シェルとして起動されると、 ~/.bashrc ファイルがあれば、 bash はここからコマンドを読み込み、実行します。 この動作は --norc オプションで行わないようにできます。 --rcfile file オプションを使うと、 コマンドの読み込みと実行を ~/.bashrc からでなく file から行わせることができます。

ということなので、勘ですがこの起動の仕方をしていて /etc/profile が読み込まれてないのだろうと予想しました(検証していません、間違っているかも)。

それで、 /etc/bash_completion.d/git-prompt の中身を見ると何度呼び出してもぶっ壊れないように作られていたので、とりあえず雑に ~/.bashrc の中で雑に [[ -s /etc/profile.d/bash_completion.sh ]] && source /etc/profile.d/bash_completion.sh としてあげることでこの問題を回避することができました。

このあたりの設定ファイルってどうまとめるのかというベストプラクティスって無いんですかね? あまり関心がないので雑に継ぎ足し継ぎ足し使ってきていてメチャクチャになってきているので、一度整理しても良いかも知れません。