Windowsで使えるターミナルとシェルのまとめ

# Windowsで使えるターミナルとシェルのまとめ
Windows で使えるターミナルとシェルをまとめてみた。
Windows でも選択肢は意外と多い。
ターミナルとシェルの組み合わせで自分好みの環境を構築できるだろう。







## ターミナルとは？
ターミナル、ターミナルエミュレータ、端末エミュレータ、ターミナルソフト、コンソール等と呼ばれる。
黒い画面で、テキストがずらずらと表示されるアレである。
ただし、画面に表示されるコマンド文字列などはシェルの機能である。
外側の GUI 部分だけがターミナルと言われる。
ターミナルは画面の見た目や操作性などを担当しているのだ。
ターミナルだけでは何もできないので、シェルと一緒に配布されていることが多い。

代表的なターミナル: xterm, Terminal(Mac), iTerm2(Mac), Win32コンソール, mintty
参考: [List of terminal emulators - Wikipedia](https://en.wikipedia.org/wiki/List_of_terminal_emulators)

PuTTY や TeraTerm はターミナルというより、SSH クライアントである。
シェルを切り替えることができない場合が多い。

### ターミナルを入れ替えて改善する項目
背景画像＆透過、コピペやドラッグ＆ドロップの動作、タブ化、フォントなど








## シェルとは？
ターミナルが外側だとすれば、シェルは中身だ。
更にその中心部にはカーネルと呼ばれる OS の中心機能がある。
広義には、カーネルとのインターフェイスを担うソフトウェア全般を指すが、ここではコマンドラインインタプリタのシェルと限定する。
コマンドラインから他のアプリを起動させたり、終了させたり、入出力をリダイレクトさせたり、シェルスクリプトやバッチファイルも実行できる。

代表的なシェル: bash, zsh, csh, cmd.exe(Win), PowerShell(Win)
参考: [List of command-line interpreters - Wikipedia](https://en.wikipedia.org/wiki/List_of_command-line_interpreters)

### シェルを入れ替えて改善する項目
パスの指定方法(/が使える)、スクリプトの構文、コマンド補完など
bash を覚えておけば、linux, win, mac などの環境で同じように使える。
Unix 風コマンドが外部コマンドとして同梱されていることが多い。








## Windowsで使えるターミナル環境

### mintty
[mintty - Wikipedia](https://en.wikipedia.org/wiki/Mintty)
[mintty project](http://mintty.github.io/)
MSYS2、Git for Windows、 Cygwin、PuTTY などで使われている。
mintty 単体でのバイナリのダウンロードはないので、上記のソフトウェアを入れるか WSLtty を使う。

0. xterm互換。
0. コピペが簡単。
0. テキストやファイル、フォルダのドラッグ＆ドロップに対応。
0. <kbd>CTRL</kbd> + <kbd>CLICK</kbd> でファイルやURLを開ける。
0. 高速なレンダリング、スクロール、キーボードフィードバック。
0. 背景テスクチャ、ウィンドウ透過。
0. 複数モニター、DPIサポート。
0. レジストリを汚さない。
0. 二次フォント。(CJKのフォントなど)
0. etc...

動作が軽くてよい。
とりあえずこれを使っておけば間違いがない。

使用する場合は MSYS2(bash) を使うことになるだろう。
MSYS2 ではパッケージ管理として pacman が使える。

mintty でタブ機能がほしい場合は tmux を導入するとよい。
[tmuxの使い方](http://qiita.com/vintersnow/items/be4b29652ff665c45198)

minttyにはwinptyが必要という問題がある。
[mintty Tips](https://github.com/mintty/mintty/wiki/Tips)

### ConEmu
[ConEmu](https://conemu.github.io/)
設定項目が多く、自由度が高い。
タブが使えるのも便利。
cmderでも使われている。
portable版がある。

### cmder
[cmder.net](http://cmder.net/)
多機能コンソールエミュレータのパッケージ。
ConEmu(ターミナル)とclink(シェル)とgit-for-windows(各種コマンド)からなる。
最低限の機能を備えたmini版と各種コマンドを含んだfull版がある。

1. タブが使える
1. タブの入力をロックできる
1. 履歴を検索できる
1. aliasを設定できる
1. Monokaiカラー
1. PowerShellモードがある
1. etc...

日本語の表示が崩れるので、設定を変える必要がある。
setting -> font -> monospaceのチェックを外す。

ConEmuとはもはや別物らしい。
ConEmuのショートカットが嫌いな場合はcmderを使うとよいらしい。

### ConsoleZ
[ConsoleZ](https://github.com/cbucher/console)
Console2の後継。
ConEmuはごちゃごちゃしていると思った人にはConsoleZがオススメ。
見た目も操作も手軽に設定できる。

### Hyper
[Hyper](https://hyper.is/)
Electron製のターミナル。
HTML5とJavaScriptで拡張できる。

[爆速でターミナルをポケモンにする](https://qiita.com/chanuu/items/b5c3d11e089ad0c7356d)
[MSYS2とHyperでピカチュウを愛でてみた](https://qiita.com/Ted-HM/items/9d94f9557c35fe6587fc)

### Terminus
[Terminus](https://eugeny.github.io/terminus/)
Electron製。
HyperよりWindows向き。

### Alacritty
Rust製。
GPUを使うので描画が爆速。
日本語入力に難あり。

### Fluent Terminal
C# UWP製。

### Qonsole
[Qonsole](http://qonsole-ahk.sourceforge.net/)
Quakeライクなターミナル。
ショートカットキーでスライド表示されるのが特徴。
シェルの指定も可能。

### MobaXterm
[MobaXterm](http://mobaxterm.mobatek.net/)
どちらかというとSSHクライアントよりではあるが、bashが使えるようなので紹介しておく。
BusyBoxベースで、Cygwinとの連携も可能で、とても高機能なターミナルであると言える。
BusyBoxがネックになることがあるので実際の運用では注意されたし。

[MobaXterm: Windowsでのcygwinに代わるターミナル環境](http://rcmdnk.github.io/blog/2015/01/24/computer-windows-remote/)

### CygTerm
Cygwin環境必須だが、CygTermというものがある。
TeraTerm、PuTTY、Poderosaなどのログインシェルを指定できないターミナルをCygwinの環境へ接続するソフトだ。

TeraTermなどに同梱されていることが多い。
TeraTermはメニューから`File => Cygwin connection [ALT + G]`で使用できる。
[PuTTY+Cygterm](http://qiita.com/tueda/items/f3f7f29e10321ac92da8)

### SSH/シリアル通信 クライアント
どのターミナルからでもOpenSSHなどは使えるが、手軽さや使い勝手が異なる。
SSHやシリアル通信だけ行う場合は、下記をオススメする。
RLogin
Poderosa
TeraTerm
KiTTY(PuTTY)

[Windowsターミナルソフト + Rlogin が最高すぎる！！](https://qiita.com/murachi1208/items/d6e4ce7ba75f1625fe51)








## Windowsで使えるシェル環境

### MSYS2
[MSYS2](http://www.msys2.org/)
[MSYS2 - SourceForge](https://sourceforge.net/projects/msys2/)
MSYS2のターミナルはminttyでシェルはbashが設定されている。
MSYS2さえ導入すれば、それだけでUnix風のコマンドライン環境が揃う。
パッケージマネージャとしてpacmanを採用している。
足りないコマンドがあればpacman -S [name]ですぐに導入できる。

### Git for Windows
[git-for-windows](https://github.com/git-for-windows/git/releases/latest)
msysGitの後継。
2.x以降でMSYS2ベースに変更された。
gitが使えるbash環境が提供されている。
windowsでgitを使っているなら大抵入っているはず。
これを普通に使うように設定してもいいだろう。

下記で詳しく説明されている。
[Git for Windows で日本語を使いたい](http://qiita.com/kumazo@github/items/2169e1ee7be278f82b94)

### Cygwin
[Cygwin](https://www.cygwin.com/)
MSYSの派生元。
非常にLinuxライクなので、それなりに詳しくないと使えない。
パッケージマネージャ(インストーラー)が使いにくいのでapt-cygスクリプトの導入は必須。
Cygwinでビルドしたものは、cygwin1.dllに依存するという欠点がある。
もちろんCygwinのbashからMinGW環境を使うことも可能。


64bit版は何か問題があったはずなので、32bit版を推奨する。


Cygwinを使うくらいならVMでDebianを入れたほうがいい。
[Debian 8 "Jessie" を Virtualbox にインストールしたメモ](http://qiita.com/smellman/items/160e19279e1b46b4aa6d)

パッケージ選択の難しさはあるが、スクリプトファイルさえ用意しておけば便利。
[Cygwinの環境を複数作ったり、パッケージのインストールを自動化したりする(たった一つのスクリプトファイルだけで…魔法のように…Linuxライク環境が構築できる！)](http://qiita.com/javacommons/items/1a182f187fd2a8df29c2#a-%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB-)

### gnupack
CygwinとEmacsを導入できるパッケージ。
色々カスタマイズされているようなので、素のCygwinにEmacsを組み合わせる方がわかりやすいと思う。

### Babun
Cygwinをベースに独自にカスタマイズされたパッケージ。
oh-my-zsh環境などが最初から揃っている。
パッケージマネージャとしてapt-cygとpactが使える。
自分でdotfilesを管理している場合は素のCygwinを使うほうがよい。

### PowerShell
Windows7からデフォルトで入っているシェル。
cmd.exeの後継。
.NETライブラリも使えるなどかなりすごい。
でもそこまでするならVisualStudioで作ったほうがいいと思う。

あとスクリプトを覚えてもWindowsでしか使えないのが残念。

オープンソース化されたのでLinuxでも使えるようになった。

最初から一部のコマンド(lsなど)が使えるのはよい。
起動が遅いので敬遠しがち。

### Bash on Ubuntu on Windows
Windows10のアップデートで導入されたLinuxサブシステム上で動くシェル。
Windows上で使うのでどうしても癖がある。
余計なことに悩まず使いたいならVMでLinuxを使うことをオススメする。

[Bash on Ubuntu on Windowsをインストールしてみよう！](http://qiita.com/Aruneko/items/c79810b0b015bebf30bb)

### BusyBox
[BusyBox - Wikipedia](https://ja.wikipedia.org/wiki/BusyBox)
[Almquist Shell - Wikipedia](https://ja.wikipedia.org/wiki/Almquist_Shell)
標準Unixコマンドを単一ファイルで提供する素晴らしいソフト。
busybox sh -lでashを使用できる。
ashは軽量低機能が特徴のシェルなので、普段使いには向かない。
Windowsで使うには、コンパイルが必要。
組み込みLinuxではよく使われている。

### gow
[Gnu on Windows - Wikipedia](https://ja.wikipedia.org/wiki/Gnu_On_Windows)
多数のGNUコマンドが使える。
シェルはbash。

### UnxUtils
[UnxUtils - Wikipedia](https://en.wikipedia.org/wiki/UnxUtils)
多数のGNUコマンドが使える。
ZIPを解凍してパスを通すだけ。
shが付いているが詳細は不明。
残念ながら日本語やUTF-8には未対応。

### clink
bash風なcmd.exeの代替ソフトウェア。
cmderでも使用されている。
Luaで拡張できる。

### NYAGOS
[NYAOS.ORG](http://www.nyaos.org/index.cgi?p=NYAGOS)
Nihongo Yet Another GOing Shell。
珍しい和製シェル。
Luaで拡張できる。









## その他

### 環境によっては役に立つソフト

#### GnuWin32
[GnuWin](http://gnuwin32.sourceforge.net/)
grepやsedなどのコマンドだけほしい場合はこれでもよい。
シェルはついていない。

#### winpty
minttyでWindowsネイティブの対話型コマンドを共存させる。
sqlite3, node.js, gitなどがうまく動かなかったり、文字化けする場合はwinptyの出番。
`winpty powershell`などとして使う。

#### cocot
ttyの前に割り込んで文字コード変換を行う。
`cocot bash`, `cocot ssh`, `cocot ping`として使う。

#### iconv
文字コード変換を行う。
Windows系コマンドで文字化けが発生した場合、S-JISとUTF-8を変換できる。
下記のようにして使うとよい。

    function wincmd()
    {
        CMD=$1
        shift
        $CMD $* 2>&1 | iconv -f CP932 -t UTF-8
    }
    alias ipconfig='wincmd ipconfig'

#### nkf
iconv同様、文字コード変換を行う。
コンパイルが必要。

### CygwinとMSYSとMinGWについて
`Cygwin`と`MSYS2 + MinGW`の環境がよく比較されているので、それらを簡単にまとめてみた。

#### Cygwin
Windows上で完全なPOSIX環境を目指して作成されたソフトウェアおよびコマンド群およびシェル環境。
cygwin1.dllがPOSIXシステムコールをエミュレーションしている。
POSIXシステムコールを利用するものはcygwin1.dllに依存していまうという問題がある。

ターミナルはmintty、シェルはbash、その他に多数のコマンドが含まれている。
GCCやPerlなどもインストーラーで組み込むことができる。

#### MSYS2
MinGWを補う目的で作られたソフトウェアおよびコマンド群およびシェル環境。

ターミナルはmintty、シェルはbash、その他に多数のコマンドが含まれている。
pacmanというパッケージマネージャを使用できる。
pacmanでMinGW環境をインストールすることができる。

#### MinGW
Windowsで利用できるGCCコマンド群である。
WinAPIヘッダーやlibcなどのライブラリを含む。

MinGW自体はコマンドのパッケージなので、CygwinやMSYS2から利用できる。
Cygwinから利用する場合は、cygwin1.dll非依存のソフトをビルドできる。
ただし、POSIXシステムコールは利用できない。

MinGWのインストーラーからMSYSを導入できるが、MSYS2ではなく、古い環境なのでオススメできない。
MSYS2からMinGWを導入するのが最もスマートなやり方。






## 用語の説明

#### Console
コンソール、システムコンソール、制御卓。
元々は大型コンピュータ(メインフレーム、汎用機)の制御卓のこと。
コンピュータへの距離が近い物理ターミナルのこと。
一般的には単なる「制御装置」の意味で使われる。

[コンソール - Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%B3%E3%82%BD%E3%83%BC%E3%83%AB)

#### Terminal
ターミナル、端末装置、端末。
パソコンが無かった時代はホストコンピュータへ接続して作業していた。
その中央のコンピュータから見た、ケーブル末端の入出力装置のことをターミナル(端末装置)と呼んだ。
コンソールとの違いは、中央との親密度。

[端末 - Wikipedia](https://ja.wikipedia.org/wiki/%E7%AB%AF%E6%9C%AB)

#### Teleprinter, Teletypewriter, Teletype, TTY
テレタイプ端末、遠隔タイプライター。
二地点間を回線でつなぎ、相手にタイプの内容を出力できるようにしたタイプライターのこと。
メインフレームやミニコンとつないでシリアルコンソールとしても利用された。

[テレタイプ端末 - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%86%E3%83%AC%E3%82%BF%E3%82%A4%E3%83%97%E7%AB%AF%E6%9C%AB)

#### Serial Console
シリアルコンソール。
キーボードとディスプレイが一体になった機器のこと。
キーボードとディスプレイを接続しないで運用するミニコンやサーバーにシリアルケーブルで接続したコンソールのこと。
ビデオ表示端末(Video Terminal)のVT100が有名。

#### Kernel
カーネル。
OSの中核部分。
ハードウェアの管理やプロセスの管理を行う。

#### Shell
シェル。
カーネルへアクセスするためのソフトウェア。
ユーザーの操作・命令をカーネルに伝え、カーネルがハードウェアを使って処理を行う。
カーネルの周りにある殻のようなイメージからシェルと呼ばれる。

CUIベースのシェルをコマンドラインシェル、GUIベースのシェルをグラフィカルシェルと呼ぶ。
CUIベースではコマンドラインインタプリタの形態となる。

[シェル - Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B7%E3%82%A7%E3%83%AB)
[Unixシェル - Wikipedia](https://ja.wikipedia.org/wiki/Unix%E3%82%B7%E3%82%A7%E3%83%AB)
[コマンドラインインタプリタ - Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%A9%E3%82%A4%E3%83%B3%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%97%E3%83%AA%E3%82%BF)
[コマンドプロンプト - Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88)

#### Virtual Console
仮想コンソール(VC)、仮想ターミナル(VT)、擬似端末、コンソール。
Linuxにおけるコンソール機能をエミュレートするための仕組み。
ハードウェア =&gt; カーネル =&gt; シェル =&gt; 仮想コンソールサービス =&gt; 仮想コンソール(or 仮想ターミナル) という階層構造になっている。
Linux起動時に表示される黒い画面は仮想コンソールである。

[仮想コンソール - Wikipedia](https://ja.wikipedia.org/wiki/%E4%BB%AE%E6%83%B3%E3%82%B3%E3%83%B3%E3%82%BD%E3%83%BC%E3%83%AB)

仮想コンソールは複数用意されており、CUIコンソールがtty1～tty6, GUIコンソールがtty7～となっている。
<kbd>Ctrl</kbd>+<kbd>Alt</kbd>+<kbd>F1</kbd>で黒い画面となり、<kbd>Ctrl</kbd>+<kbd>Alt</kbd>+<kbd>F7</kbd>でGUIに戻る。

Linuxにおけるttyデバイスは仮想コンソールやシリアルコンソールにつながっている。
ttyの名前からわかるようにTeletypeの仕組みが由来である。
仮想コンソールはgettyというソフトウェアでつながっている。
gettyはget ttyという意味で、いくつか派生がある(mingetty, agetty, mgetty, etc...)。

/dev/tty1 起動時の画面などで使われる仮想CUIコンソール
/dev/tty7 GUIを使っている場合に割り当てられる仮想GUIコンソール
/dev/ttyS1 RS232-Cシリアルケーブル等でつながっている機器(シリアルコンソール)
/dev/ttyUSB1 USBシリアルケーブルでつながっている機器(シリアルコンソール)
/dev/pts/0 telnetやsshで接続している仮想ターミナル

つまり、/dev/pts/0へ入力してやると、つながっている相手側の画面に出力することができる。

[ttyとかptsとかについて確認してみる](https://qiita.com/toshihirock/items/22de12f99b5c40365369)
[シリアルポート - Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%AA%E3%82%A2%E3%83%AB%E3%83%9D%E3%83%BC%E3%83%88)
[疑似端末 - Wikipedia](https://ja.wikipedia.org/wiki/%E6%93%AC%E4%BC%BC%E7%AB%AF%E6%9C%AB)

#### Terminal Emulator
ターミナルエミュレータ、仮想ターミナル、ターミナルソフトウェア、ターミナル。
ターミナルをソフトウェア的に再現したもの。

[端末エミュレータ - Wikipedia](https://ja.wikipedia.org/wiki/%E7%AB%AF%E6%9C%AB%E3%82%A8%E3%83%9F%E3%83%A5%E3%83%AC%E3%83%BC%E3%82%BF)






## 【実践編】MSYS2 の環境構築
MSYS2が簡単に環境を構築できることがわかった。
シェルがbashなので、応用が効くのも利点だ。
以下はそのやり方の記録。

内容が膨らんできたので別ページに分離。
[MSYS2で快適なターミナル生活](http://qiita.com/Ted-HM/items/4f2feb9fdacb6c72083c)






## 【番外編】VSCodeおよびAtomでターミナル環境
エディタ環境から簡単にターミナルを起動することができる。
Visual Studio Codeは統合ターミナルといって初めからシェルを呼びだす機能が搭載されている。
Atomからは`PlatformIO IDE Terminal`というパッケージが使える。

MSYS2のbashを呼びだすには下記のように設定すればよい。
必要に応じて環境変数も設定しておくとよい。

Visual Studio Code

    "terminal.integrated.shell.windows": "C:\\msys64\\user\\bin\\sh.exe",
    "terminal.integrated.shellArgs.windows": ["--login", "-i"]


PlatformIO IDE Terminal

    Shell Override
    C:\msys64\user\bin\sh.exe

    Shell Arguments
    --login -i