背景
Windows10標準機能として定着してきたWSL(Windows Subsystem for Linux)ですが、コマンドライン上で生活しているとMacのopenコマンドのようにパワポやPDF、画像ファイルを開きたくなることが結構あります。
理想的にはWindows側とUbuntu側をあまり意識せずにファイルをいじりたいところです。
下記リンクでは、引数で指定したファイルをcmd.exeで開くようにaliasを設定することで解決しています。
上記の問題点として、Ubuntu側から見たWindows側のファイル(/mnt/c/以下のファイル)を開けないことが挙げられます。
これを解決するために仮想openコマンドを実装します。(ほぼここのパクリです)
やったこと
下記をopenというファイル名として保存し、実行権限を与えた上でPATHの通ったディレクトリに移動します。
# !/bin/bash
to_winpath(){
local abs_path=`readlink -f $1`
if echo $abs_path | grep -q /mnt/c; then
local win_path="C:"${abs_path#/mnt/c}
echo ${win_path//\//\\}
else
local wsl_path=`powershell.exe -Command 'echo ($env:LOCALAPPDATA + "\lxss")' | tr -d '\r'`
local internal_path=${abs_path//\//\\}
echo "${wsl_path}${internal_path}"
fi
}
/mnt/c/Windows/explorer.exe `to_winpath $@`
機能
macのopenコマンドのように-aオプションで開くアプリケーションを選択することはできませんが、explorer.exeでダブルクリックで開くように設定されているアプリケーションで開かれます。
これはWSLから見たWindowsのディレクトリ(/mnt/c/以下)にいても使うことができます。
$ open image.png # カレントディレクトリの画像を開く
$ open ./hoge.pptx # 相対パスで指定したパワポを開く
$ open ./ # カレントディレクトリをexplorer.exeで開く
やっていること
to_winpathでexplorer.exeに渡すファイルパスを生成し、explorer.exeで実行しているだけです。
openコマンドに引数として渡したファイルパスが/mnt/cから始まる場合にはC:、それ以外ではC:\Users\user\AppData\Local\lxssから始まるファイルパスに変換してexplorer.exeに渡しています。
余談
実装してみるとVimから画像ファイルを開ける上に、rangerを使っているのでコマンドライン環境でほぼ完結してしまいそうです。
この記事を書いてる途中で気づいたんですが、wsl-openというコマンドがありましたw
npmで簡単にインストールできます。