はじめに
WSLでGUIを使おうとするといつも設定でつまづく。
Webでよく見る資料と違う設定が必要だったのでメモ
環境
Windows 11 Pro 23H2
WSL Ubuntu 22.04
WSL バージョン: 2.4.13.0
カーネル バージョン: 5.15.167.4-1
WSLg バージョン: 1.0.65
VSCode version 1.86.2
結論
GUI、例えばxeyes
が
$ xeyes
Error: Can't open display:
で動かないときVSCodeから接続していたら~/.bashrc
に、SSHとかでアクセスするときは~/.profile
に
$ export DISPLAY=:0
と追加して再起動か、
sudo bash ~/.bashrc
だったり
sudo bash ~/.profile
すればxeyes
が動く。
詳細
数年前の古い資料だとxServerを使おうとかあるけど、Win11ならWSLgが使えるから特に何もしなくても動くよとか検索すると出てくる。
$ sudo apt install x11-apps
$ xeyes
で
が出てくるよ、というやつ。
で、以下のようにうまくいかないとき
$ xeyes
Error: Can't open display:
こんなときは
$ export DISPLAY=:0
$ export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0
と書けば良い、毎回書くのは面倒なので~/.profile
に書きましょうというのも検索したら出てきたけど、書き込んで再起動しても
$ xeyes
Error: Can't open display:localhost:0.0
となってしまう。
.bashrc
と.profile
の違い
手動でexport DISPLAY=:0
書けば動くのになんで読み込まれないんだと思っていたけど、もしかしたらVSCode経由でWSL繋いでいるからかと思いChatGPTに聞いてみると、以下の回答が得られた。
.profile
- ログインシェルで読み込まれる(
ssh
やtty
とかで直接ログインしたとき)- GUIの端末アプリや WSL の通常起動では読み込まれないことが多い
.bashrc
- インタラクティブな非ログインシェル(たとえば WSL のターミナルを開いたとき)で読み込まれる
- 普段使う端末環境ではこっちが確実に実行される!
WSLで何が起きてた?
WSL(特に Windows Terminal で開いた場合)は基本的に「非ログインの bash シェル」として起動するから、
.profile
は読み込まれず、.bashrc
が読み込まれる!
なるほど!
古い資料はSSHからの接続が多かったから~/.profile
に書けとあったんだな、と納得した。
また、raspberryPiに接続するときなんかもSSHだから、そういうときの作業の記憶と混ざっていたかもしれない。
注意
自分の環境ではPowershellからWSL
コマンドで入ったときにはどちらも反映されなかった。環境変数とかいじらないとだめなのかもしれない。