WindowsTerminalで実行した際、一部のPATHが通ってない
WindowsTerminalでWSL2 ubuntuを実行しシェルを立ち上げた際にbundle等のコマンドが使えず一部のPATHが通ってないことに気づきました。
また確認してみるとPowerShellからwsl -d ubuntuなどを入力して立ち上げた際も同様に通ってません。
しかし、VSCodeのRemoteWSLのターミナルではPATHが問題なく通ってます。
bashで通るようになる
PATHが通ってないシェル上でbashを入力するとパスが通ります。
起動時に実行されてるシェルもBashでbash入力で起動するシェルも当然Bashですが、この2つは何が違うのでしょうか。
どうやらWindowsから起動したWSL2のShellは~/.bashrcに書き込んだ環境変数を読み込んでいないようです。
~/.bashrcと~/.profileの違いとログイン・シェルの起動
環境変数の書き込み先として使用されますが
~/.profileはログイン・シェル
~/.bashrcはインタラクティブ・シェル
にそれぞれ対応するそうです。
つまり、WSL起動時にはログイン・シェルが起動していて~/.profileが読まれるが~/.bashrcは読まれず、
bash入力後はインタラクティブ・シェルが起動するので~/.bashrcが読み込まれるようになるということです。
以前WSLで設定したときはログインシェルが起動せずインタラクティブ・シェルが最初に起動するから~/.bashrcに環境変数を追加するべきとなっていたはずなのですが、
その後の(最近かも?)アップデートで、いつの間にかログイン・シェルが最初に起動するようになったようです。
また、~/.bashrcにはプロンプトのカラー設定が書いてあるので、インタラクティブ・シェルではプロンプトでユーザー名とディレクティブが見やすく色分けされるのに対して、ログインシェルでは色分けされず若干見づらくなります。
対応策
ログイン・シェルの中でさらにbashを実行すればいいのですが、起動と分けて別に毎回入力するのはちょっと嫌なので、できればターミナルからシェルを起動した際にPATHが通っていてほしいですね。
~/.profileの方にもPATHをを書き込めば一応PATHに関しては解決しますが、普通に使う分にはインタラクティブ・シェルの方が便利なのでこちらを立ち上げる方法を考えます。
WSLからのシェル起動時にbashコマンドを指定する
windowsのシェルから起動するwslコマンドで
wsl -d ubuntu bash
と入力すればデフォルトのログイン・シェルが起動したあとにBashのインタラクティブ・シェルが立ち上がるので一発で~/.bashrcが読み込まれます。(ubuntuのところは各自のディストリビューションに読み替えてください。)
実質的にはwslコマンドでWSLを起動した後にbashを叩いてるのとなんら変わらないですが、ワンライナーで書けるので、これをターミナルの設定に入れていけばいいです。
WindowsTerminalの設定
WindowsTerminalでWSL ubuntuのインタラクティブシェルを一発で起動する方法を説明します。
ついでに起動時のディレクトリを~(ホーム)に変更し、WindowsTeminalのデフォルトをPowerShellからWSL2に変更します。
WindowsTerminal起動後のウィンドウ上のタブの右の + v のvマークからSettingを選択し
profiles.jsonファイルを編集します。
"profiles":の中にname:"Ubuntu"と書かれた項目があるはずなのでその部分を
{
"guid": "{ ここはそのまま残す }",
"hidden": false,
"name": "Ubuntu",
"commandline" : "wsl -d Ubuntu bash",
"startingDirectory": "//wsl$/Ubuntu/home/[account_name]"
},
で書き換えます。"guid"の行はそのまま残し、[accout_name]の部分は自分のアカウント名に置き換えてください。
"commandline"の部分に上で試したコマンドを使用してます。
"startingDirectory"を書き換えればホーム以外でも自由な場所を設定できます。
さらに
"defaultProfile": "{さっき残したubuntuのguidに書き換える}",
の部分を先程残したguidに書き換えます。これで完成です。
見ればだいたい意味は分かると思いますが詳細はWindows Terminal User Documentationを参照してください。
追記
上記でguidは既存のものを流用する形で書いてますが
PowerShell上で
[guid]::NewGuid()
で新しいguidを取得できるそうです。1
-
「関係ないMarkdownの話」コードブロックで**"[ ]:"**が表示できない。そのまま書くとコードブロック中でもエスケープされず、注釈やリンクとして認識されるのか何も表示されなくなる。かといって\でエスケープすると、今度は
\[\]\:となる。行頭に全角スペースで回避できたけどバグかな?
参考:https://news.mynavi.jp/article/win10tips-399/ ↩