(´ワ`)

主に技術系備忘録、たまに日記。

より実用的なopenコマンドでディレクトリを開く in WSL2

WSLで open のコマンドを使いたいときの方法はもうすでにいくつもある

gitlab.com

qiita.com

しかし、 open のために、しかもWSLだけのためにわざわざCLIを入れたくなかったので、上記記事に加えて個人的にもう少し手を加えた open コマンドを実装しているのでその部分だけ書いておく

if [[ $(uname -r) =~ "microsoft*" ]]; then
  # support `open` command in WSL
  function open() {
    if [ $# -eq 0 ]; then
      local WSLPATH=$(wslpath -w .)
      /mnt/c/Windows/System32/cmd.exe /c start "" "$WSLPATH" > /dev/null 2>&1
    else
      for dir in $@
      do
        local WSLPATH=$(wslpath -w $dir 2> /dev/null)
        if [ -n "$WSLPATH" ]; then
          /mnt/c/Windows/System32/cmd.exe /c start "" "$WSLPATH" > /dev/null 2>&1
        else
          print -P "%F{160}Path not found: $dir"
        fi
      done
    fi
  }
fi

以下はただの解説。

cmd.exeはフルパスにする

普段WSLを使用するなら環境変数Windowsのパスを含めないように以下のような設定を wsl.conf に入れていると思う。

[interop]
appendWindowsPath = false

こうした場合、Windowsのパスから外れるためcmd.exeは直接使用できない。そのためcmd.exeの実行はフルパスで実行している。

cmd.exe実行時の出力は無視する

WSLからのcmd.exe実行時には必ず以下が出力される

上記の現在のディレクトリで CMD.EXE を開始しました。
UNC パスはサポートされません。Windows ディレクトリを既定で使用します。

内容は書いてある通りなのだが、注意書きなのでシステム上に支障はないし実際開けるので毎回開くたびに出るのは煩わしい。 ので、 /dev/null で吐き捨てるようにしてる。

引数なしでカレントパスを開く、複数選択で複数開く

好き好きだと思うけど、カレントパスをopenするのに毎度スペースとドット打つのは面倒なので open のみでカレントパスを開くようにしている。 また、引数でパスを複数選択することで一度にエクスプローラーを開けるようにした。使ったことはいまのところはない。

startコマンドの引数に空文字列を入れておく

WSLからCドライブを参照しているディレクトリ(フォルダ)から open したい場合、引数にパスのみの指定だとコマンドプロンプトあるいはPowershellでそのパスを開いてしまう。自分の場合、エクスプローラーで開くことだけを目的としているため、 start の第1引数に空文字入れておくことでWindowsのパス上からでも open できた。

感想

URLとか入力したらブラウザから開けるようにしたら便利だと思うけど、MacとかLinuxでそういった使い方をしたことはない(MacならAlfred、WindowsならPowerToys Runでどこでも検索できる)ので自分で使う分にはエクスプローラーを開くだけでいいかな・・・