Windowsでのターミナルとシェルの環境 (おまけのパッケージ管理)

こんにちは。

私は仕事ではMacを使っているのですが、私用のPCにはWindowsを使っています。
Macはプログラミング的にはUnixライクな環境で、もろもろの設定などは慣れているのですが、Windowsで分析や開発をすることはまちまちで、しばらくすると設定や環境が古いことがよくあります。

備忘もかねて、Windowsの分析・開発環境を整理しておきます。

# ざっくり結論
- ターミナルとしてのcmdは止めよう
- ターミナルは最低限cmder, できればWindows Terminal
- シェルはPowerShellに慣れよう
- Git for Windowsも必要

# ターミナル (外側) とシェル (内側) の違い

話を分かりやすくするために、あらためてターミナルとシェルの違いを簡単に整理しておきます。

シェルはファイルを操作したり、実行したり、各種通信したりするためのコマンドの集まり、およびそのシステムです。
一方、ターミナルはコマンド操作するための、見た目上のインターフェースです。
見た目が同じだからと言って、動いているシェル (操作系) が同じとは限りません。
逆に言うと、自分が使いやすいように、ターミナルもシェルも設定しましょう。
cmd (コマンドプロンプト) やpowersehllのようにターミナルがシェルと一体になっているものもあります。

よくあるツールは以下のような感じです。

|項目|Windows|Mac|Linux|
|---|---|---|---|
|ターミナル|cmd, powershell, mintty, cmder, windows terminal|terminal, iterm2|GNOME Terminal, xterm|
|シェル|cmd, powershell, msys2, mingw, git bash, wsl|bash, zsh|bash, zsh|

MacやLinuxでもいろいろツールはあるのですが、輪をかけてWindowsは多くの人がそれぞれ使いやすいツールを作った結果、いろいろなものがあります。

ちなみに、Windows Terminalのドキュメントに、ターミナルとコンソールとシェルの違いを説明した記事へのリンクがありました笑
https://www.hanselman.com/blog/whats-the-difference-between-a-console-a-terminal-and-a-shell

# ターミナル

Windowsで分析している人を見ていると、ターミナルとしてコマンドプロンプト (cmd.exe) をそのまま使っている人も多いです。
フォントや色が見にくく、画面共有とかになると正直困ります。
基本的に他のものを使ってほしいです。

Windowsのターミナルについては色々と記事があるので、個別の詳細はそちらを参照してもらえればと思います。
こちらでは、独断と偏見でおすすめを書きます。

## Windows Terminal
https://docs.microsoft.com/ja-jp/windows/terminal/
2020年5月に正式リリースされました。
私も使い始めたばかりですが、タブ機能もありますしシェルも選べるので、Windowsではcmdではなく、こちらをデフォルトと考えるほうがいいと思います。

## Cmder
https://cmder.net/
最近は基本的にはずっとこれを使っていました。
タブ機能、シェルの選択、その他にもこまごま設定できて便利でした。
シェルにはcmdを使っていました。
powershellだと起動時のコマンドでエラーが出ていたので、うまく設定できていなかったのだと思います。
見た目は、cmdよりずっと綺麗で見やすいですが、最近のターミナル (HyperやTerminusなど) と比べると少し劣ります。
いい意味で枯れている気がします。

## Hyper
https://hyper.is/
cmderと比べるて最近のターミナルで、ミニマルな見た目ですが、見やすくカッコいいです。
設定ファイルがJavaScriptファイルなので、*.jsファイルを既定で開くアプリをVS Codeにしておくと便利です。

## Terminus
https://eugeny.github.io/terminus/
こちらもタブ機能やシェルの選択など基本的なことができます。
アルファ版ですが、見やすいですし、軽く触ってみた感じ使いやすいです。

# シェル

ターミナルを起動したときに、実際にやりとりされるコマンドが組み込まれたシステムです。
どれもクセが強いですが、慣れましょう。

## PowerShell
https://docs.microsoft.com/ja-jp/powershell/scripting/install/installing-powershell-core-on-windows?view=powershell-7.1
Windowsの代表的なシェルです。
cmdと比べて、管理権限とか含め、様々なことができるのでこちらに慣れていると便利だと思います。
とは言いつつも、私はコマンドのややこしさから何度も挫折しました笑。
バージョン6以降はPowerShell Coreというオープンソースになり、MacやLinuxでも使えるため、万が一にも使うことがあるかもしれません。
現時点の最新は7.1です。

## Windows Subsystem for Linux
https://docs.microsoft.com/ja-jp/windows/wsl/compare-versions
ざっくり説明すると仮想マシンとしてLinuxを起動して、それにターミナルからアクセスする方法です。
WSL1とWSL2で仕組みが違いますので、ドキュメントを見る際は注意してください。
私は使ったことありませんが、見てる感じやり方としてはシンプルなので、いろいろ考えるのが面倒な場合はいいのではないでしょうか。
ただし、あくまで仮想マシン的な立ち位置なので、ファイルのやりとりなどは注意する必要があります。

## cmd
https://docs.microsoft.com/ja-jp/windows-server/administration/windows-commands/cmd
古き良きコマンドプロンプトです。
必要最低限しかありませんが、cdとmkdirくらいしか使わないのであれば、意外と困ることはありません。
とはいえ、コマンドからインストールしたり諸々実行したりするには不都合なところがあります。

## MSYS2 + MinGW
https://www.msys2.org/
2016年ごろに使っていました。
WindowsでLinux系の操作ができるので便利でした。
WSLがある今では、あまり候補ではないかと思います。

# その他
コマンドまわりでいくつか書いておきます。

## Git
https://gitforwindows.org/
Gitがないと、分析も開発もできないレベルなので、インストールしましょう。
こちらはこちらで、Git BashというBashコマンドをWindowsに提供してくれますね。

## SSH
https://japan.zdnet.com/article/35119381/
https://mimimopu.com/powershell-ssh-client/
昔のWindowsはsshが存在せず、PuttyやGit for Windows経由とかで、コマンドの準備や鍵の作成をしていました。
しかし2018年のWindowsのアップデートで、OpenSSHがネイティブで使えるようになりました。
当時は他のツールからインストールしたsshと競合することがありましたね。
現状であれば、WindowsネイティブのSSHを使えばいいと思います。

ちなみに、SSH鍵設定やGitHubへの登録をしたのに、プルやフェッチでエラーが出たことがあります。
Configファイルのホスト名をgithub.comにすることで解決しました。
そんなことで違いが...
https://stackoverflow.com/questions/64374764/git-clone-with-ssh-shows-error-permission-denied-publickey

## パッケージ管理
WindowsではGUIベースでアプリをインストールすることが多いです。
ブラウザを立ち上げて、欲しいアプリを検索して、インストーラをダウンロードして、インストール。
Linuxではそんなこと考えられないし (もちろんする場合もあります)、Windowsでもアプリ (パッケージ) の管理をコマンドベースでやれるようなツールがあります。

代表的なのは以下です。

### chocolatey
https://chocolatey.org/
以前使っていましたが、いかんせんリポジトリ上のアプリのバージョンが古かったり、欲しいのがなかったりして、使うのをやめました。
リポジトリの管理は大変ですよね。
最近は改善しているかもしれません。

### scoop
https://scoop.sh/
使ったことはありませんが、Windowsの環境構築系の記事では結構見かけます。
よさげですね。

### homebrew for Windows
https://docs.brew.sh/Installation
Macユーザーのほぼ全員がお世話になっているであろう代表的なパッケージ管理ツールです。
逆にこれ以外は知りません。
WindowsだとWSL上で動作するようです。

---
ややこしくならないように、パッケージ管理ツールはどれか1つを使うようにしましょう。

ちなみに私はどれも使っていません。

# 終わり
以上です。
それぞれ好みや慣れとかいろいろあると思いますが、参考になれば幸いです。