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/ ↩