Edited at

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

More than 1 year has passed since last update.


起動コマンド


  1. wsl

  2. bash


  3. [distro] i.e. ubuntu (以降 ubuntu)

wslbash は default に設定してあるもの、通常一番最初にインストールしたディストリビューションが起動されます。

それは wslconfig によって変更できます。

ubuntu はウィンドウズメニューから起動したときと同じ。


起動ディレクトリ

wslbash では コマンド実行したときのディレクトリそのまま起動する。

ubuntu では Ubuntu の中でのホームディレクトリで起動する。


コマンドライン引数


  1. wsl [command]

  2. bash -c [command]

  3. ubutnu -c [command]

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 は / ということ

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

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

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

とせっせとバックスラッシュをスラッシュに置き換えて実行するのが一番楽。

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 に入らずにコマンドを実行したいという需要は満たしにくい。


失敗例

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 に戻してみたが、結果は同じだった。

PS> bash -c 'diff $(wslpath ".\path\to\sample1") $(wslpath ".\path\to\sample2")'

1c1
< 1111111
---
> 2222222


余談

GitHubにあるwsl-config.md

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 について


使い方

PS> wslconfig

Linux Windows サブシステムの管理操作を実行します

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


リスト

PS> wslconfig /l

Windows Subsystem for Linux ディストリビューション:
Ubuntu (既定)
kali-linux
openSUSE-42


既定の設定

PS> wslconfig /s opensuse-42

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


初期化

PS> wslconfig /u opensuse-42

登録を解除しています...


wslpath について

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

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


参考