【10分でわかるかもしれない】シェル(shell)とは?

初めまして、新入社員のくりりんです!入社するまでは、何故海の色が深い青から鮮やかな緑まで変わるのかを生物の観点から研究していました。
そんな私がIT業界でプログラマーを目指したのは、プログラミングで研究のデータ処理を行うのが楽しかったからです!他にも理由はありますが、一番はプログラミングを仕事としてやりたいといった単純なきっかけです。

2ヶ月間のJava研修が終わった後にアサインされたプロジェクトは、ECサイトのバックエンド側の開発でした(今も開発中です)。学生時代にプログラミングに触れてたとはいえ、独学で自分がやりたい処理をなんとか書けていた程度のスキルです(涙)
プロジェクトの説明を受ける中で聞いたこともない単語(Spring Boot, Docker, Vue.js, Gradle, Yarn, REST API, JSON etc…)がたくさん出現、最初から私の頭はオーバーヒート状態でした(絶望)
まずは、用意されたPCで開発環境の構築から始まり、その過程にGit Bashの操作がありました。そこでbashって何だ!?シェルって何だ!?となったので調べました。今回はそのシェルについて解説していきます。

わからないことだらけで始まった仕事ですが、先輩方に質問すれば丁寧にわかりやすく教えてくれます! プログラミングに関する様々な概念やツールの理解を深めるための勉強会をやっていますし、分かる人が積極的に社内全体のスキルアップに貢献してくれています。質問を気軽に聞ける環境で仕事ができることは私自身楽しいと感じております。

少し前置きが長くなりましたが、シェルについて解説していきます!

シェル(shell)って何?

貝殻好きですか?私は好きです、よく海岸で拾ってました。
ここでいうシェルというのは、もちろん貝殻ではありません(笑)

シェルはOSと対話するためのインターフェース(窓口)を提供するソフトウェアのことです。ユーザーからコマンドが入力されることで、OSの中核であるカーネルとやり取りし、カーネルのプログラムを呼び出します。 カーネルは、アプリケーションの動作で使われるリソース(CPUやメモリなどのハードウェア)を管理しています。

シェルは何をしている?

シェルはユーザーからの命令をカーネルに伝え、カーネルから返ってくる結果をユーザーに伝えます。

シェルはユーザーから入力されたコマンドを解釈し、それをカーネルに伝えます。そして、カーネルはシェルから伝達された要求に応えてプログラムの操作を行い、その結果をシェルに返します。返ってきた結果をシェルが解釈し、それをユーザー側に出力します。
つまり、シェルの役割を一言で説明すると「人からの入力とコンピュータからの出力をそれぞれに伝えること」です。

なぜシェルを通じてカーネルを操作するのか?

そもそもカーネルの中にシェルと同じようなキーボードからのコマンド入力で操作できる機能を入れればいいのではないか。という考えがでてくると思います。そうしない理由は以下の点が挙げられます。

  • 使用者がシェルを使いやすいようにカスタマイズできる
  • 今のOSとは別のOSを利用するときに、使っていたシェルを移植できれば、今のOSで行っていた操作が再現できる
  • シェルがエラーしてクラッシュした際に、OSの中核であるカーネルへの影響を小さくできる

最後の点は冒頭に書いた”貝殻”の役割と同じですね。貝類の生物が中の柔らかいセンシティブな部位を守るために硬い殻を持っていると同じように、コンピュータのカーネルというセンシティブな部位を包み込んで守るためにシェルがあります。

シェルの操作

カーネルは、ファイル操作やプロセス操作などの様々な命令を実行しています。それらの機能は、カーネルの中に特別な関数(システムコール)として定義されています。
シェルはカーネルの中に定義されているシステムコールをユーザーから入力されたコマンドで呼び出しています。ユーザーが入力するコマンドは、C言語で書かれたプログラムです。そのプログラムの中身にカーネルのシステムコールの呼び出しが書かれています。

シェルは、CUI(キャラクターユーザーインターフェース)をベースとするコマンドラインシェルのことを一般的に指します。一方、意識的に思い浮かべることはないと思いますがGUIをベースとするグラフィカルシェルもシェルの1つの形態として含まれています。

グラフィカルシェルの操作は、PCを扱うほとんどの人が普段から行っていると思います。たとえば、Windowsでスタートメニューやタスクバーなどの機能を持っているExplorerがグラフィカルシェルになります。

コマンドラインシェルの操作は、ターミナル(端末)から行われます。
ユーザーはターミナルを通じて、コマンド(命令)をシェルに伝え、シェルを操作することができます。逆にシェルはターミナルを通じてユーザーにコマンドの結果を伝えることができます。
このような操作方法のことを対話型(インタラクティブ)操作と呼びます。インタラクティブとは、”双方向”の意味を持つ単語で、ITの分野ではユーザーの操作に反応を返す”対話”を示しています。双方向のやり取りが可能であるからインタラクティブと呼ばれているんですね。
また、実行したい複数のコマンドと条件分岐(if文など)やループ処理(for文など)を事前にスクリプトに書いて、それをシェルに指定し、まとめて実行することができます。複数のコマンドや条件分岐やループ処理などを一連の処理として記述したスクリプトのことをシェルスクリプトと呼びます。
次にいきなり出てきたターミナルについて解説します。

ターミナルとは?

コマンドの送受信や入出力した結果の表示機能のみをもった端末。

ターミナルとは、ユーザーがコンピュータへのコマンド入力やコンピュータからの実行結果の出力などをする時に使用するハードウェアのことを指しています。ターミナルへ入力するハードウェアとしてキーボード、出力するハードウェアとしてディスプレイを使います。昔は上の画像のような「ダム端末」という機器でシェルを操作していました。

現在のターミナルは、物理的なターミナルをソフトウェアによって実装したターミナルエミュレータが使用されています。そのため、現在で言う”ターミナル”は基本的にターミナルエミュレータのことを指しています。他にも端末エミュレータ、ターミナルソフトなど様々な呼び名があります。黒い画面で、緑や白のテキストが表示されているカッコいいアレのことです。ターミナルエミュレータは様々なものが開発されています、以下にOSごとの代表的なターミナルを示します。

OS Terminal Emulator
Windows PowerShell, Git Bash, ConEmu
Mac OS Terminal, iTerm2
Ubuntu GNOME Terminal, Konsole

ターミナルを使ってシェルを操作するのでターミナルとシェルは一緒のソフトウェアなのかなと考えてしまうかもしれません。しかし、ターミナルとシェルは別々のソフトウェアです。どちらもユーザーが操作するソフトウェアで混合されやすいので注意しましょう。
つまり、ターミナルはシェルを操作するための入出力の画面だけを提供するソフトウェアのことです。

シェルの種類

最後にシェルの種類について解説していきます。
シェルと一口に言っても、実はシェルには様々な種類があります。どのシェルの役割も、カーネルとユーザーの仲立ちをする点で同じですが、それぞれのシェルの特徴は違います。以下に代表的なものを紹介します。

【sh】
古くからあるシェルで、多くのOSで利用できます。AT&Tベル研究所のSteven Bourne氏によって開発され、開発者の名にちなんでBシェル(Bourneシェル)と呼ばれています。shは、長い歴史から今でも標準シェルとして、シェルスクリプトの作成に利用されています。しかし、古いシェルであるため機能面が足りない部分も多く、対話的に使う場面では不便です。
【csh】
C言語に似た構文をもつことから、Cシェルと呼ばれています。Cシェルはカリフォルニア大学バークレー校のWilliam Joy氏によって開発されました。Bシェルに比べ、対話的に使用する場面で便利な機能(ヒストリー機能やジョブ制御、エイリアスなど)を実装しています。しかし、シェルの文法がBシェルと異なるため、シェルスクリプトを書くのには向いていません。現在ではCシェルの後継としてTCシェルがあります。
【bash】
Bシェルを基盤とし、その機能を拡張したのがbashです。bashの正式名称は「Bourne Again Shell(born again shell)」です。”born
again(生まれ変わり)”を書けたダジャレがbashの名の由来です。MITのBrian Fox氏によって開発されました。Bシェルと後方互換性を持つため、Bシェルを置き換えることが可能です。
【tcsh】
CシェルにTenexの機能を組み込んだのがTCシェルです。Tenexとは、コマンドライン(コマンドの入力部分)の編集機能、ファイル名やコマンドの補間機能があるシステムのことです。Cシェルの後継として、カーネギー・メロン大学のKen Greer氏によって開発されました。対話的に使用する上で便利な機能を持っています。
【zsh】
bashやtcshなどの他のシェルの機能をいいとこ取りし、さらに独自の拡張機能を実装したのがZシェルです。プリンストン大学のPaul Falstad氏によって開発されました。多機能であることから使いこなすのに時間がかかりますが、様々な作業を効率良くできます。

多くのシェルはBシェルから派生しており、上記に挙げた中の4種のシェルもその派生シェルの一つに含まれています。歴史的にどのように派生したのかが参考文献の「Linux におけるシェルの進化」に記されているので興味のある方は是非読んでみてください。

まとめ

  • シェル:ユーザーとカーネルを仲介してくれるソフトウェア
  • シェルスクリプト:シェルによって解釈・実行される一連の処理を記述したスクリプト
  • ターミナル:シェルの操作に必要な画面を提供してくれるソフトウェア
  • bash:シェルの一種

開発で使ったGit Bashは”Gitがインストールされたbashへのターミナルエミュレータ”ということになります。

参考文献
三宅英明・大角祐介(2015)『新しいLinuxの教科書』SB Creative
初心者が調べた。shellとは
【1分でわかる】シェルスクリプトとは?
OS基礎の基礎をまとめてみた。
Linux におけるシェルの進化
Windowsで使えるターミナルとシェルのまとめ

最近の記事

  • 関連記事
  • おすすめ記事
  • 特集記事

アーカイブ

カテゴリー

PAGE TOP