より実用的なopenコマンドでディレクトリを開く in WSL2
WSLで open
のコマンドを使いたいときの方法はもうすでにいくつもある
しかし、 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でどこでも検索できる)ので自分で使う分にはエクスプローラーを開くだけでいいかな・・・