PowerShellからBashへ

PowerShellに別れの挨拶をしたので。

結論

WSLを使おう。

背景

今までコマンドを打ち込むときはPowerShellを使用していた。OSはWindows10なので、OSとの親和性を考慮しての選択だった。

PowerShell7CUIが弱かったのを改善しようとマイクロソフトが力を入れて開発しているクロスプラットフォームで動作するシェルである。 力を入れているだけあってコマンドプロンプトよりも使い勝手がはるかに向上している。

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

gccmakeコマンドを使うために一応入っている。

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     # デフォルトのディストリビューションとして設定

デフォルトに設定しておくとbashPowerShellからデフォルトの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