WSL 起動方法の違いについて

# 起動コマンド

1. `wsl`
2. `bash`
3. `[distro]` i.e. `ubuntu` (以降 `ubuntu`)

`wsl` と `bash` は default に設定してあるもの、通常一番最初にインストールしたディストリビューションが起動されます。
それは `wslconfig` によって変更できます。
`ubuntu` はウィンドウズメニューから起動したときと同じ。

# 起動ディレクトリ
`wsl` と `bash` では コマンド実行したときのディレクトリそのまま起動する。
`ubuntu` では Ubuntu の中でのホームディレクトリで起動する。

# コマンドライン引数
1. `wsl [command]`
2. `bash -c [command]`
3. `ubutnu -c [command]`

```powershell
PS> wsl sudo apt update
PS> bash -c 'sudo apt update'
PS> ubuntu -c sudo apt update
```
`bash -c` はスペース区切りで複数のコマンド渡す場合クオーテーションでくくらないとダメでした。
ディレクトリもそのままだし、 Linux コマンドの先頭に `wsl` を付け足すだけで Windows から使えるので、基本的に `wsl` を使うのおすすめ。

## ディレクトリ区切り文字の違い
注意点として Windows のディレクトリ区切りは基本的に `\` であるのに対して、 Linux は `/` ということ

```powershell
PS> wsl diff .\path\to\sample1 .\path\to\sample2
```

と書いても思った通りに動作しない。

```powershell
PS> wsl diff ./path/to/sample1 ./path/to/sample2
```

とせっせとバックスラッシュをスラッシュに置き換えて実行するのが一番楽。
PowerShell のコマンドを使って以下のようにはかける。

```powershell
PS> wsl diff ('.\path\to\sample1'.Replace('\', '/')) ('.\path\to\sample2'.Replace('\', '/'))
```

windows10 バージョン 1803 (April 2018 Update) のリリースと同時に `wslpath` というコマンドが WSL の中に入った。
`wslpath` を使えば `C:\path\to` を `/mnt/c/path/to` にドライブ部分も置き換えてくれるのでとても便利。
だがしかし、 WSL 内のコマンドなので、上記のように Windows から WSL に入らずにコマンドを実行したいという需要は満たしにくい。

## 失敗例
```powershell
PS> wsl diff (wsl wslpath .\path\to\sample1) (wsl wslpath .\path\to\sample2)
diff: .pathtosample2: No such file or directory

PS> wsl "diff $(wsl wslpath '.\path\to\sample1') $(wsl wslpath '.\path\to\sample2')"
/bin/bash: diff .pathtosample1 .pathtosample2: command not found

PS> wsl 'diff $(wslpath ".\path\to\sample1") $(wslpath ".\path\to\sample2")'
/bin/bash: diff path/to/sample1 path/to/sample2: No such file or directory

PS> ubuntu -c 'diff $(wslpath ".\path\to\sample1") $(wslpath ".\path\to\sample2")'
diff: .pathtosample2: No such file or directory
```

## 成功例
同じコマンドのはずがなぜか `bash -c` だけ意図通り動いた。
普段デフォルトシェルを zsh にしているので、 bash に戻してみたが、結果は同じだった。

```powershell
PS> bash -c 'diff $(wslpath ".\path\to\sample1") $(wslpath ".\path\to\sample2")'
1c1
< 1111111
---
> 2222222
```

# 余談
[GitHub](https://github.com/MicrosoftDocs/WSL/)にある[wsl-config.md](https://github.com/MicrosoftDocs/WSL/blob/17046/commandline/WSL/wsl-config.md)に

```powershell
There are three ways to launch and run WSL:

1. `wsl.exe` or `bash.exe`
1. `wsl -c [command]` or `bash -c [command]`
1. `[distro]` ie `ubuntu` -- this is the same as launching the installed app from the Windows menu.
```

という箇所があるんだけど、現在 `wsl` コマンドに `-c` は使えず、 `wsl [command]` で実行する。
将来的にそうするつもりなのかミスなのか…
個人的には楽なので、 `wsl [command]` 形式のままが良いです。

## wslconfig について
### 使い方
```powershell
PS> wslconfig
Linux 用 Windows サブシステムの管理操作を実行します

使用法:
    /l、/list [/all] - 登録されたディストリビューションを一覧表示します。
        /all - すべてのディストリビューションを一覧表示します (オプション)。
               現在インストールまたはアンインストール中のものも含まれます。
    /s、/setdefault <DistributionName> - 指定のディストリビューションを既定として設定します。
    /u、/unregister <DistributionName> - ディストリビューションの登録を解除します。
```

### リスト
```powershell
PS> wslconfig /l
Windows Subsystem for Linux ディストリビューション:
Ubuntu (既定)
kali-linux
openSUSE-42
```

### 既定の設定
```powershell
PS> wslconfig /s opensuse-42
PS> wslconfig /l
Windows Subsystem for Linux ディストリビューション:
openSUSE-42 (既定)
kali-linux
Ubuntu
```

### 初期化
```powershell
PS> wslconfig /u opensuse-42
登録を解除しています...
```

## wslpath について
```powershell
wslpath usage:
  -a    force result to absolute path format
  -u    translate from a Windows path to a WSL path (default)
  -w    translate from a WSL path to a Windows path
  -m    translate from a WSL path to a Windows path, with ‘/’ instead of ‘\\’

  EX: wslpath ‘c:\users’
```

渡すパスはクオーテーションでくくらないといけない。

# 参考
- [GitHub - WSL - Allow WSL to recognize Windows path names?](https://github.com/Microsoft/WSL/issues/522)
- [GitHub - WSL - Releases](https://github.com/MicrosoftDocs/WSL/releases/tag/17046)