LoginSignup
3

More than 3 years have passed since last update.

posted at

WSL 上でMacのopenコマンド (/mnt/c以下のファイルも開きたい)

背景

Windows10標準機能として定着してきたWSL(Windows Subsystem for Linux)ですが、コマンドライン上で生活しているとMacのopenコマンドのようにパワポやPDF、画像ファイルを開きたくなることが結構あります。
理想的にはWindows側とUbuntu側をあまり意識せずにファイルをいじりたいところです。

下記リンクでは、引数で指定したファイルをcmd.exeで開くようにaliasを設定することで解決しています。
- WSLでmacのopenコマンドみたいなこと
- WSL で start コマンドを使う

上記の問題点として、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_winpathexplorer.exeに渡すファイルパスを生成し、explorer.exeで実行しているだけです。
openコマンドに引数として渡したファイルパスが/mnt/cから始まる場合にはC:、それ以外ではC:\Users\user\AppData\Local\lxssから始まるファイルパスに変換してexplorer.exeに渡しています。

余談

実装してみるとVimから画像ファイルを開ける上に、rangerを使っているのでコマンドライン環境でほぼ完結してしまいそうです。
この記事を書いてる途中で気づいたんですが、wsl-openというコマンドがありましたw
npmで簡単にインストールできます。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
3