22
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

WindowsTerminalやPowerShellからWSL2を実行した際に~/.bashrcが読み込まれない

Last updated at Posted at 2020-02-19

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"と書かれた項目があるはずなのでその部分を

profile.json
        {
            "guid": "{ ここはそのまま残す }",
            "hidden": false,
            "name": "Ubuntu",
            "commandline" : "wsl -d Ubuntu bash",
            "startingDirectory": "//wsl$/Ubuntu/home/[account_name]" 
        },

で書き換えます。"guid"の行はそのまま残し、[accout_name]の部分は自分のアカウント名に置き換えてください。
"commandline"の部分に上で試したコマンドを使用してます。
"startingDirectory"を書き換えればホーム以外でも自由な場所を設定できます。

さらに

profile.json
"defaultProfile": "{さっき残したubuntuのguidに書き換える}",

の部分を先程残したguidに書き換えます。これで完成です。
見ればだいたい意味は分かると思いますが詳細はWindows Terminal User Documentationを参照してください。

追記

上記でguidは既存のものを流用する形で書いてますが
PowerShell上で

 [guid]::NewGuid()

で新しいguidを取得できるそうです。1

  1. 「関係ないMarkdownの話」コードブロックで**"[ ]:"**が表示できない。そのまま書くとコードブロック中でもエスケープされず、注釈やリンクとして認識されるのか何も表示されなくなる。かといって\でエスケープすると、今度は\[\]\:となる。行頭に全角スペースで回避できたけどバグかな?
    参考:https://news.mynavi.jp/article/win10tips-399/

22
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?