2020-09-06_wslでWindowsディレクトリパスをLinux表記に変換して移動する

このページで分かること

  • WSL上でWIndowsのディレクトリへ移動する方法

git bashみたいにここで開くが使えない(もしかしたら方法あるかもしれませんが)ので WSL上でWindowsのディレクトリパスをLinux表記に変換して移動するFunctionを作りました。

環境

  • OS: fedora31(WSL)

functionの内容

手っ取り早くfunctionは以下のとおりです。

1
2
3
4
5
function wcd (){
    read -rp "Type WindowsDir>" wd
    cd "$(wslpath "$wd")"
    echo "pwd> `pwd`"
}

詳細の説明

WSLではWindowsパスを変換するコマンドにwslpathコマンドが用意されています。 例えば以下のようWindowsパスを渡してあげるとWSL上のパスに変換してくれます。

1
2
#r wslpath "C:\Users\winu\Desktop"
   /mnt/c/Users/winu/Desktop

で、毎回wslpathで変換してcdで移動するのめんどくさいなと思い上記のfunctionを書くわけですが 躓きポイントが結構ありました。

まず次の様なコマンドを組み立てます。

1
2
windows_dir="C:\Users\winu\Desktop"
cd $(wslpath "${windows_dir}")

このコマンドはうまいこと動作してくれますが、問題はWindowsパスに半角スペースが入った場合。例えば次のようなパターン。

1
2
3
4
5
windows_dir="C:\Program Files"
cd $(wslpath "${windows_dir}")

## 実行結果
-bash: cd: too many arguments

cdの引数が複数あるよと怒られてしまいます。wslpathの変換結果が/mnt/c/Program△Files(※△は半角スペースを明示的に表記)となっておりProgramとFilesの間に半角スペースが含まれておりcdの引数が2つになってしまいました。

この場合はダブルクォートやシングルクォートで囲んであげれば良いのですが既にwslpathの引数でダブルクォートで囲っており結構悩みました。シングルクォートで囲むと変数が展開されないのでダブルクォートで更に囲んであげる必要があります。

試行錯誤の結果cd "$(wslpath "$wd")"となりました。wslpathで変換された/mnt/c/Program△Filesがcdの引数に渡る際に更にダブルクォートで囲われている為、半角スペースが入っていても一つの引数として認識されます。

read -rを使用しているのはバックスラッシュがWindowsのパス区切り文字ですがLinuxだと特殊文字として扱われてしまいfunctionの引数に直接渡すと意図通り解釈してくれませんでした。

C:UserswinuDesktopこんな感じでバックスラッシュが特殊文字として解釈され消えてしまします。 この場合はバックスラッシュを2つ続けて書くか、ダブルクォートやシングルクォートで囲う必要がありますが引数セット時にそれを実施する方法がなく、function内で渡してやるしかなかったです……。

本当はwcd ${windows_dir}みたいにcd感覚で使いたかったのですが、wcdでfunctionを実行後にWindowsパスを貼り付ける方法としました。

簡単そうに見えて意外と奥が深く、半日ぐらい考え込んでしまった。