Home About
Windows , WSL , Firefox , open-command

macOS の open コマンド相当のコマンドを WSL でも使えるようにする

Windows 11 の WSL での話です。 macOS の open コマンド相当の機能が使いたいのであれこれ調べた結果を備忘録として書き残します。

open

結論としてはこのスクリプトを ~/bin/open などパスを通しているディレクトリに配置して chmod u+x ~/bin/open して実行権を付与しておく。

#!/bin/bash
basepath=file://///wsl.localhost/Ubuntu
if [[ $1 =~ html$ ]]; then
    currentwinpath=${basepath}${PWD}/$1
    firefoxexe=/mnt/c/PROGRA~1/MOZILL~1/firefox.exe
    $firefoxexe $currentwinpath
else
    if [ $1 = "." -o $1 = "./" ]; then
        currentwinpath=${basepath}${PWD}
        explorer.exe $currentwinpath
    else
        currentwinpath=${basepath}${PWD}/$1
        explorer.exe $currentwinpath
    fi
fi

basepath で指定している wsl.localhost/Ubuntu は使用環境に合わせる必要があります。

open ./index.html のように末尾が html の場合は Windows の firefox.exe を起動して index.html を表示します。 open . のように引数の末尾が html でなければ explorer.exe を起動して指定パスを開いた状態にします。

そもそも、パスの指定をこのスクリプトのようにしなくとも explorer.exe . としても機能するのですが、 explorer.exe ./ とか explorer.exe foo/ または explorer.exe ./foo/ のようにすると、意図通り動かない。 この open コマンド方式ならば、その問題を回避できる。

Windows 11 になり WSLg として Ubuntu版 Firefox を使うこともできますが、まだ使い勝手の点では Windows版 Firefox の方が便利なので、そちらを使います。

firefox.exe へのパスの指定方法ですが、firefox は通常以下のパスにインストールされているのですが、

/mnt/c/Program Files/Mozilla Firefox/firefox.exe

bash のスクリプトで半角スペースを含むパスを指定する意図通り作動しません。 半角スペースの前にバックスラッシュを入れてエスケープすればよいはずですが、 どうもうまくいきません。

なお、手動で直接起動する場合は、バックスラッシュを半角スペースの前に入れる方法で問題ありません。

$ /mnt/c/Program\ Files/Mozilla\ Firefox/firefox.exe file://///wsl.localhost/Ubuntu/home/foo/index.html

そこで、ネットで検索したところ、 /mnt/c/PROGRA~1/MOZILL~1/firefox.exe このパスで作動するという情報得たので、今のところこれにしています。 なお、explorer.exe はパス指定なしで起動できます。これと同じように、firefox.exe も Windows側でパスを通すなどして、 フルパス指定しないで firefox.exe だけで起動できるようにしておけば問題ないはず。 そうすれば、 /mnt/c/PROGRA~1/MOZILL~1/firefox.exe などという謎パスを使わないで済む。そのうち試してみようと思います。

追記

Windows10 でも同じようにできるのかと思ったらできませんでした。 Windows10 では、Windows側からUbunut ファイルシステムがデフォルト状態ではマウントされていないようです。 たとえば、Windows側で Z ドライブに WSLのUbunutのファイルシステムをマウントしておいた場合、先ほどのスクリプトの basepath を以下のように書き換えることで対応できました。

basepath=file:///Z:

別件で問題発生。 WSL で /mnt/c/ 以下のパスに居るときに open . とすると、このスクリプトでは意図通り作動しないことがわかりました。 WSLを使っているのだから Windowsの C ドライブ上で作業することはそれほど多くはないかもしれませんが、そのうち修正を試みるつもりです。