PowerShellに別れの挨拶をしたので。
結論
WSLを使おう。
背景
今までコマンドを打ち込むときはPowerShellを使用していた。OSはWindows10なので、OSとの親和性を考慮しての選択だった。
PowerShell7はCUIが弱かったのを改善しようとマイクロソフトが力を入れて開発しているクロスプラットフォームで動作するシェルである。 力を入れているだけあってコマンドプロンプトよりも使い勝手がはるかに向上している。
Set-Location
, Copy-Item
, Remove-Item
といったPowerShellの関数のエイリアスとして、それぞれcd
, cp
, mv
が登録されている。
- echo
- cd
- cp
- cat
- mv
- mkdir
- pwd
- rm
- rmdir
etc...
ほとんどのUnixコマンドはエイリアスとして登録されている。
問題点
このように頑張ればPowerShellだけでターミナル環境を整えることは難しくない。
しかし、それでも私がPowerShellにさよならを言ったのはやはりLinuxとの整合性がないからである。
grep
ってPowerShellでどうやるの?date
をフォーマットしたいんだけど・・・make
を使いたい、sed
を使いたい
こういった疑問をいちいちグーグルするのに疲れてしまった。
仮に調べてわかっても、Linux用に書いたMakefile
などはそのまま使えないのである。
代替案
Git Bash
Git for Windowsをインストールすれば付いてくるbash
である。
機能は悪くないが、色使いが好みではなかった。
Cygwin
レガシーなイメージがあるけど、2021年に更新していた。
MinGW
gcc
やmake
コマンドを使うために一応入っている。
Msys2
Msysの64bit版。
pacman
でパッケージ管理ができる。
WSL
試しにWSLを使ったら、これが意外に満足のいくものだったのでそれを紹介したいと思う。
WSLはDocker for Windowsを使っていれば特に追加でインストールするものはないのも高評価である。
Ubuntu-20.04
ディストリビューションは何でもよいが、使い慣れているUbuntu-20.04ディストリビューションを使用する。
wsl --install -d Ubuntu-20.04
インストール後、ユーザー名とパスワードを登録すればすぐに使える。
オプショナル操作
wsl --set-version Ubuntu-20.04 2 # wsl から wsl2 へ wsl --set-default Ubuntu-20.04 # デフォルトのディストリビューションとして設定
デフォルトに設定しておくとbash
でPowerShellからデフォルトのWSLに入れる。
Dockerを使う
欲張りなのでdocker
コマンドも使いたい。
WSLでは自動的にWindows側のドライブを/mnt/
にマウントしてくれるのでファイル共有も簡単である。
さらに、WSL側からWindowsの実行バイナリを実行することが出来る。
$ docker.exe version Client: Cloud integration: v1.0.22 Version: 20.10.11 API version: 1.41 Go version: go1.16.10 Git commit: dea9396 Built: Thu Nov 18 00:42:51 2021 OS/Arch: windows/amd64 Context: default Experimental: true Server: Docker Engine - Community Engine: Version: 20.10.11 API version: 1.41 (minimum version 1.12) Go version: go1.16.9 Git commit: 847da18 Built: Thu Nov 18 00:35:39 2021 OS/Arch: linux/amd64 Experimental: false containerd: Version: 1.4.12 GitCommit: 7b11cfaabd73bb80907dd23182b9347b4245eb5d runc: Version: 1.0.2 GitCommit: v1.0.2-0-g52b36a2 docker-init: Version: 0.19.0 GitCommit: de40ad0
PATHも自動的にホストから引き継いでくれる便利さ。
実体はどこにあるかというと、
$ which docker.exe /mnt/c/Program Files/Docker/Docker/resources/bin/docker.exe
ということで、これのシンボリックリンクを作成することでホスト側のdocker
を使うことが出来る。
$ sudo ln -s "/mnt/c/Program Files/Docker/Docker/resources/bin/docker.exe" /usr/bin/docker $ docker version # the same content here