起動コマンド
wsl
bash
-
[distro]
i.e.ubuntu
(以降ubuntu
)
wsl
と bash
は default に設定してあるもの、通常一番最初にインストールしたディストリビューションが起動されます。
それは wslconfig
によって変更できます。
ubuntu
はウィンドウズメニューから起動したときと同じ。
起動ディレクトリ
wsl
と bash
では コマンド実行したときのディレクトリそのまま起動する。
ubuntu
では Ubuntu の中でのホームディレクトリで起動する。
コマンドライン引数
wsl [command]
bash -c [command]
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
余談
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’
渡すパスはクオーテーションでくくらないといけない。