一発起動WSL！

こんにちは。すずともです。
僕は授業などでWSLを使う機会があるのですが、先生の説明聞いてると

「ファイルに直接アクセスするにはエクスプローラのアドレスバーに`\\wsl$`って打つとアクセスできるよー」

ってよく言われます。
確かにそれでもできる（というかそれが正式なアクセス方法）なのですが、ファイルを整理するときに、Windows内にあったりOneDriveにあったりWSL内にあったりごちゃごちゃでめんどくさいと思いませんか？

# 一発起動WSL！
```console
$ wsl
```

ホントにこれだけ。PowerShellなどでこれをすると、カレントディレクトリをマウントした状態でwslが起動してくれます。

```console
PS C:\Users\Kamek> wsl
kamekyame@TOMO-NOTE:/mnt/c/Users/Kamek$ apt list | grep python2

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

games-python2-dev/focal 2.2ubuntu3 all
idle-python2.7/focal-updates,focal-security 2.7.18-1~20.04.1 all
libpython2-dbg/focal 2.7.17-2ubuntu4 amd64
libpython2-dev/focal 2.7.17-2ubuntu4 amd64
libpython2-stdlib/focal 2.7.17-2ubuntu4 amd64
libpython2.7-dbg/focal-updates,focal-security 2.7.18-1~20.04.1 amd64
libpython2.7-dev/focal-updates,focal-security 2.7.18-1~20.04.1 amd64
libpython2.7-minimal/focal-updates,focal-security 2.7.18-1~20.04.1 amd64
libpython2.7-stdlib/focal-updates,focal-security 2.7.18-1~20.04.1 amd64
libpython2.7-testsuite/focal-updates,focal-security 2.7.18-1~20.04.1 all
libpython2.7/focal-updates,focal-security 2.7.18-1~20.04.1 amd64
python-dev-is-python2/focal 2.7.17-4 all
python-is-python2/focal 2.7.17-4 all
python2-dbg/focal 2.7.17-2ubuntu4 amd64
python2-dev/focal 2.7.17-2ubuntu4 amd64
python2-doc/focal 2.7.17-2ubuntu4 all
python2-minimal/focal 2.7.17-2ubuntu4 amd64
python2.7-dbg/focal-updates,focal-security 2.7.18-1~20.04.1 amd64
python2.7-dev/focal-updates,focal-security 2.7.18-1~20.04.1 amd64
python2.7-doc/focal-updates,focal-security 2.7.18-1~20.04.1 all
python2.7-examples/focal-updates,focal-security 2.7.18-1~20.04.1 all
python2.7-minimal/focal-updates,focal-security 2.7.18-1~20.04.1 amd64
python2.7/focal-updates,focal-security 2.7.18-1~20.04.1 amd64
python2/focal 2.7.17-2ubuntu4 amd64
kamekyame@TOMO-NOTE:/mnt/c/Users/Kamek$
```

こんな感じで、`c/Users/Kamek`をマウントして、`apt`コマンドも使えてますね！

# 恩恵を得られそうな人
- ちょこっとLinuxの力を借りて実行してみたいなーっていう人（cコンパイル）
- WindowsメインでCUIアプリ作ってるけどLinuxでも動くかサクッと確かめたい人

など…

# 便利になったこと

**① vscodeでwslを利用しやすくなった！**

[恩恵を得られそうな人](#恩恵を得られそうな人)の2つ目に該当する人向けですね。一応Windows・Linux互換のCUIアプリケーション作ってるけど、ほんとに動くんだろうか。パス関係とか厄介だしなぁ。

ってときに、`wsl`。
vscodeのターミナルからも利用できるので、わざわざwslを別画面で起動しなくたって、プロジェクトフォルダをwsl内にコピーしなくたって、今開いてるディレクトリをマウントしてくれるのでサクッとLinuxで実行できます！

**② Windowsからファイルを扱いやすい！**

①にちょっと被る点でもあるのですが、最初に書いた「エクスプローラのアドレスバーに`\\wsl$`って打つとアクセスできるよー」っていう手順が要らなくなります。なんてったってカレントディレクトリがマウントされるのですから。

ファイル移動やコピーなどコマンドでの操作が慣れてない人でもエクスプローラで行えばOK！

**③ サーバにssh鍵を設定しやすい！**

ssh鍵を作成するコマンド`ssh-keygen`はWindows、Linux両方から使えます。
しかし、作成した鍵を簡単にサーバに転送して設定してくれる`ssh-copy-id`というコマンドはLinuxからしか利用できません。

Windowsからサーバにssh鍵を設定しようとすると、
ftpソフトなどを使って鍵を送ってからサーバのターミナルで設定したりなんていう複雑な動作が必要です。

そんなときには一発起動WSLの出番！
下記のように一行コマンドでssh鍵の転送から`authorized_keys`ファイルの設定まで行ってくれます。

```console
PS C:\Users\Kamek> wsl
kamekyame@TOMO-NOTE:/mnt/c/Users/Kamek$ ssh-copy-id -i ./.ssh/id_ed25519.pub  jetbot@nano-4gb-jp45
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "./.ssh/id_ed25519.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
jetbot@nano-4gb-jp45's password:

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'jetbot@nano-4gb-jp45'"
and check to make sure that only the key(s) you wanted were added.

kamekyame@TOMO-NOTE:/mnt/c/Users/Kamek$
```


# 最後に
何となくいけるのではないかと思って打った`wsl`コマンド。一回知ると便利すぎて開発もはかどります！

# 追記
初めは一発起動コマンドが`bash`として記事を書いていましたが、`wsl`が本来のコマンドらしいので書き換えました。

`bash`から`wsl`にたどり着くまでの経緯を残しておきましょう笑

---

~~正直`bash`コマンドでWSLのbashシェルが起動する理由がいまいちわかってないのでだれか教えてください！！🙇~~

[WSLコマンドリファレンス](https://docs.microsoft.com/ja-jp/windows/wsl/reference#bashexe)に`bash`の本体である`bash.exe(C:\Windows\System32\bash.exe)`について記載がありました！

また、コマンドリファレンスには

> Windows Subsystem for Linux を操作するための過去のコマンドもあります。 これらの機能は、wsl.exe 内に含まれますが、引き続き使用できます。

と書いてあるとおり、`wsl`コマンドでもいけました…
`bash`は**過去のコマンド**らしいです。

```console
PS C:\Users\Kamek> wsl
kamekyame@TOMO-NOTE:/mnt/c/Users/Kamek$
```