Home About Contact
Windows , WSL , Firefox , open-command

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

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

この記事は古くなりました。 意図通り作動しない場合は、 こちらの最新記事をお試しください。

open

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

wslpath コマンドを使えばもっと簡単に記述できることが判明しました(追記その3 を参照)。

#!/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 などという謎パスを使わないで済む。そのうち試してみようと思います。

追記その1

この open コマンド、 open foo.xlsx とかでエクセルファイルを MS-Excel で開くこともできるのです。びっくり。 もちろん、MS-Excel がインストールされていれば。 Suffix が html のみ Firefox へ、それ以外は Explorer へ渡しているので、Explorer がエクセルファイルがきたら、MS-Excel で開いてくれる、というただそれだけの話だとは思いますが。 いつも macOS のターミナルで open foo.xlsx しているので、癖で Windowsの WSL でも無意識に使っていた。

追記その2

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

basepath=file:///Z:

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

追記その3 wslpath コマンドを使う

wslpath コマンドを使えばもっと簡単に記述できることが判明。

#!/bin/bash
if [[ $1 =~ html$ ]]; then
    /mnt/c/PROGRA~1/MOZILL~1/firefox.exe "$(wslpath -w "$(pwd)/$1")"
else
    explorer.exe "$(wslpath -w "$(pwd)/$1")"
fi