Edited at

Windows Subsystem for Linux でファイルを開くワンライナーを、macOS と共通化


結論

$ file=mydir/index.html && if type cmd.exe; then cmd.exe /c start ${file}; else open ${file}; fi


環境


  • Windows 10 Pro 17133.1 (April 2018 Update)

  • macOS High Sierra 10.13.4

以下「Windows Subsystem for Linux」を wsl と略します。


ファイルを開く方法

explorer.exeにファイルを渡せば、そのファイルを開いてくれます。


wsl

$ explorer.exe index.html



Windows Subsystem for Linuxでない環境にも対応

Macではexplorer.exe等は無く、代わりにopenコマンドを使います。


mac

$ open index.html


なので、typeコマンドでexplorer.exeの有無を確認する必要があります。

こんなイメージです。

file=index.html

if type explorer.exe; then
explorer.exe ${file};
else
open ${file};
fi

ワンライナーにすると以下です。


wsl/mac

$ file=index.html && if type explorer.exe; then explorer.exe ${file}; else open ${file}; fi



ファイルパスを変換する方法

上記の方法でファイル名を指定することができますが、ディレクトリ階層を含むパスは無効になってしまいます。ディレクトリ階層の区切り文字がWindowsとLinuxとで異なるためです。

wslにはwslpathというコマンドがあり、wsl上のLinuxファイルパスをWindowsの形式に変換してくれます。


wsl

$ wslpath -w mydir/index.html #=> mydir\index.html



Windows Subsystem for Linuxでない環境にも対応

先程のif文の中にwslpath -wを含めます。こんなイメージです。

file=mydir/index.html

if type explorer.exe; then
explorer.exe `wslpath -w ${file}`;
else
open ${file};
fi

ワンライナーにすると以下です。


wsl/mac

$ file=mydir/index.html && if type explorer.exe; then explorer.exe `wslpath -w ${file}`; else open ${file}; fi


ただしここまで書いたあとに気付いたのですが、explorer.exeではなくcmd.exe /c startを使えば、ファイルパスを変換してくれるためwslpathは不要なようです。

参考: WSLでmacのopenコマンドみたいなこと - Qiita


まとめ

冒頭に書いたようなコマンドになります。


wsl/mac

$ file=mydir/index.html && if type cmd.exe; then cmd.exe /c start ${file}; else open ${file}; fi


URL等も、これで開くことができます。


wsl/mac

$ file='https://www.google.co.jp/' && if type cmd.exe; then cmd.exe /c start ${file}; else open ${file}; fi



参考