シェル、ターミナル、コンソール、コマンドライン


いろいろ混同されがちなやつ。筆者もまったく混乱してないとは主張しがたい。

> この記事は初版を2014年1月に書きはじめ、いまのバージョンを2015年4月頃に書いてたけど、擬似端末/仮想コンソールあたりの理解が怪しいのでお蔵入りになってました。ので、そのあたりの説明は微妙。

## コマンドライン(command-line)

文字でコマンドを打ち込んで操作するインターフェイスのこと。

## シェル(shell)

人間様がOSを操作するためのインターフェイスのこと。貝のようにOSの<ruby>核<rp>(</rp><rt>カーネル</rt><rp>)</rp></ruby>を守ってるからシェルと呼ぶんだって噂。

大別すると **コマンドラインシェル** と **グラフィカルシェル** がある。

### Unixシェル

UNIXやUNIX-likeなOSで利用されるコマンドラインシェル。現代では[GNU Bash](http://ja.wikipedia.org/wiki/Bash)や[Z Shell](http://ja.wikipedia.org/wiki/Z_Shell)などが知られる。

Shellにもいくつかの系統があるが、主にBシェル([Bourne Shell](http://ja.wikipedia.org/wiki/Bourne_Shell))の系統が主流。BashもBシェルの流れをくむ。

* [shell - POSIX シェルの組み込みコマンド一覧 - Qiita](http://qiita.com/magicant/items/b7f7f7526193e5c8dc00)

Unixシェルは入力された文字列をプログラムとして解釈する[コマンドラインインタプリタ](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)としての機能を持ち、シェルコマンドを羅列したテキストファイルを **シェルスクリプト** として実行することができる。

### Unixのグラフィカルシェル

[X Window System](http://ja.wikipedia.org/wiki/X_Window_System)の上に構築されたシェル。どこからどこまでを担当するものをシェルと呼ぶのか明確な定義はないので、[デスクトップ環境](http://ja.wikipedia.org/wiki/%E3%83%87%E3%82%B9%E3%82%AF%E3%83%88%E3%83%83%E3%83%97%E7%92%B0%E5%A2%83)や[ウィンドウマネージャ](http://ja.wikipedia.org/wiki/%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6%E3%83%9E%E3%83%8D%E3%83%BC%E3%82%B8%E3%83%A3)と同義だと思っても概ね間違ってなさそうな感触がある。

あまりシェルと呼ばれることはないけど[GNOME](http://ja.wikipedia.org/wiki/GNOME)や[KDE](http://ja.wikipedia.org/wiki/KDE)がメジャーどころで、シェルと呼ばれたりするのあUbuntuの[Unity](http://ja.wikipedia.org/wiki/Unity_(%E3%83%A6%E3%83%BC%E3%82%B6%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%95%E3%82%A7%E3%83%BC%E3%82%B9))、[GNOME Shell](http://ja.wikipedia.org/wiki/GNOME_Shell)なんかがある。 *(つまるところ、よくわからんのよね)*

### Windowsのシェル

コマンドラインシェルとして[cmd.exe](http://ja.wikipedia.org/wiki/Cmd.exe)(コマンドプロンプト)や[PowerShell](http://ja.wikipedia.org/wiki/Windows_PowerShell)が、グラフィカルシェルとして[Explorer](http://ja.wikipedia.org/wiki/Windows_Explorer)がある。

[Cygwin](http://ja.wikipedia.org/wiki/Cygwin)や[MSYS2](https://msys2.github.io/)でUnixシェルをインストールすることもできる。

* [MSYS2でWindowsにzsh環境を導入する - Qiita](http://qiita.com/magichan/items/7702d7865deaaca2ad44)

コマンドラインシェルとしてBashやZShellもインストールできるほか、Windows用に開発された[NYAOS](http://www.nyaos.org/)といふものもある。

Explorerは重い! と言ってグラフィカルシェルも代替シェルに入れ替へるひとたちも居るけど、まあそのあたりは自己責任で。

## 端末(terminal)

単語としては単に「末端」とか「終着駅」みたいな意味なんだけど、この場合は遠隔地からコンピュータを利用する機械のこと。「ビデオ端末(video terminal)」とも。

![420px-Televideo925Terminal.jpg](https://qiita-image-store.s3.amazonaws.com/0/4121/15648e30-ac46-6ddf-bb40-0ebab16d7c4b.jpeg "420px-Televideo925Terminal.jpg")


↑みたいな機械。写真は http://commons.wikimedia.org/wiki/File:Televideo925Terminal.jpg より。(パブリックドメイン)

2000年以降に初めてぱそこんに触れた筆者にはむかしむかしのことはよくわからないのだけれど、[ミニコンピュータ](http://ja.wikipedia.org/wiki/%E3%83%9F%E3%83%8B%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF)って種類の電算機が隆盛を誇ってた時代があって、[VAX/VMS](http://ja.wikipedia.org/wiki/OpenVMS)ってコンピューターとOSがあった時代もあったそうな…

### 端末エミュレータ

端末をとりまく環境は極めてややこしい。

MacOSXの「ターミナル(Terminal.app)」とかLinuxのGnome Terminalとか、WindowsのTeraTermなどは、[端末エミュレータ](http://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)などと分類される。

「エミュレータ」を名乗ってるからには、↑の写真みたいな機械の「まねっこ」をしてる。

具体的には[VT100](http://ja.wikipedia.org/wiki/VT100)シリーズ↓が参照されることが多い。

![220px-Terminal-dec-vt100.jpg](https://qiita-image-store.s3.amazonaws.com/0/4121/96af5709-3015-ba99-35e7-d1e7c52fd10b.jpeg "220px-Terminal-dec-vt100.jpg")

この手の技術に関しての日本語での入門的な記事は[Text-Terminal-HOWTO](http://archive.linux.or.jp/JF/JFdocs/Text-Terminal-HOWTO.html)にあるので、興味があれば読まれたい。

## コンソール

「ターミナル」がコンピュータを遠隔利用するための機械なのに対して、[コンソール](http://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%B3%E3%82%BD%E3%83%BC%E3%83%AB)は直接操作するための装置。しかし現代のコンピューターではディスプレイやキーボードを直接繋いだり、ノートブック型やタブレット型のようにそもそも一体化してるので何がなんだかといふ感じだ。

このあたり、[擬似端末](http://ja.wikipedia.org/wiki/%E6%93%AC%E4%BC%BC%E7%AB%AF%E6%9C%AB)とか[仮想コンソール](http://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)とか非常にややこしい概念がいろいろ登場するのだけれど、はっきり言って筆者の説明能力を超えるので割愛したい。

OSやサーバー管理以外の文脈で俗に「コンソール」と呼ばれるものは「ターミナル」を指すことが多い気がする。

### シリアルコンソール

### tty

ttyはもともと **Teletype** の略。

* [ttyについて ttyやptsってなんぞ？ - それマグで！](http://takuya-1st.hatenablog.jp/entry/20101024/1287947368)
* [シリアルコンソールを極めよう - Part5. ターミナル編 - インフラ寺子屋ブログ](http://infra-terakoya.hatenablog.jp/entry/2014/06/20/015403)

*(このあたりの理解がぁゃιぃので割愛)*

## まとめ

非常にざっくりとまとめると

* 標準出力を文字として表示したり、キーボード入力を取得したりするのが **ターミナル(エミュレータ)**
* 主にターミナルを介してコマンドを打ち込んでプログラムを実行するのが **Unixシェル**
* ターミナルにコマンドを打ち込む行が **コマンドライン** (そのまんま)
* Unix系OSでのターミナルエミュレータは **擬似端末** を通じてシェルとやりとりする

誤解されやすいことベースでまとめると

* ターミナルはコマンドを解釈しない (それは **シェル**)
* ターミナルのショートカットキーとシェルのショートカットキーは別
	* `Ctrl+a`, `Ctrl+e`, `Ctrl+r`などはシェルが解釈する (正確にはBashではreadlineが)
	* MacのTerminal.appなどの`Command+t`(新規タブ), `Command+v`(テキスト貼り付け)などはターミナルが解釈する
* パーソナルコンピューターにはコンソールと呼ぶべきものは **ない**
	* あるいはコンピューター(計算機)とコンソール(制御卓)が一体化してる
	* 俗に「ターミナル」が「コンソール」と呼ばれることが多い気がする
	* [コンソールターミナルユニット for VT100](http://www.jpcltd.co.jp/itec_hansin/console.html)のような製品もある


ターミナルに関する話題はかなり興味深くて、[224桁問題 - SGR(1006)形式の拡張マウストラッキングについて - Qiita](http://qiita.com/kefir_/items/4de35de8f0abe4f35392)のような、近年になって普及が進んだ仕様もあり目が離せない。

## あとがき

この記事は[ターミナルの検索結果 - Qiita](http://qiita.com/search?utf8=%E2%9C%93&sort=rel&q=%E3%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB&sort=rel)が悲しいことになってるので書いた。これで明日から ~~新入社員相手にどや顔できますね~~ コンソール・シェル・ターミナルを混同しなくなりますね。