すでにメンバーの場合は

無料会員登録

GitHubアカウントで登録 Pikawakaが許可なくTwitterやFacebookに投稿することはありません。

登録がまだの方はこちらから

Pikawakaにログイン

GitHubアカウントでログイン Pikawakaが許可なくTwitterやFacebookに投稿することはありません。

IT用語

【IT用語】 シェルとは?コマンドライン操作の立役者について知ろう!

ぴっかちゃん
ぴっかちゃん

シェルは私たちユーザーがキーボードで記述した命令を、ユーザーに代わってOSの心臓部であるカーネルに伝えてくれる仲介役です。シンプルな記述で複雑なOS操作ができるのはシェルのおかげです。

シェルの役割の全体像

macOSやLinuxを、文字だけから構成されるコマンドラインで操作をするためには、ターミナルというプログラムだけでなく、実はシェルというプログラムの存在が欠かせません。

しかし、視覚的なウィンドウをもつターミナルとは異なり、シェルには視覚的なウィンドウがありません。それゆえに、シェルの説明はとても抽象的になりがちです。

この記事では、目に見えないシェルに対するイメージを、少しずつふくらませていきながら、シェルの具体的な役割、シェルの代表的な種類と機能を、一緒に見ていきましょう!

(※補足説明の内容が難しく感じられる場合には読み飛ばしても構いません。)

シェルの概要

macOSなどのUNIXや、LinuxなどのUNIX系OSにおけるシェルとは、OS(オペレーティング システム)を使用する私たちユーザーが、OSの心臓部に対して、キーボードで命令を出す手助けをしてくれているプログラムです。

shell(シェル)とは日本語で殻(から)という意味を持つ英単語です。真珠の「貝殻」や、カメの「甲羅」や、たまごの「殻」を、英語ではすべて「shell」と呼びます。

真珠とカメとたまご

どれもシェルが本体を包んでいる点において共通していますよね。実はUNIXとUNIX系OSにおけるシェルも同じです。

それでは、UNIXとUNIX系OSにおけるシェルが包んでいる本体とは何なのでしょうか。

それはカーネルと呼ばれる、OSの心臓に当たる部分です。kernel(カーネル)とは日本語で中核という意味を持つ英単語です。

カーネルを包み込むシェル

シェルCommand-Line Interface(コマンドライン インターフェース)、略してCLI(シーエルアイ)と呼ばれることもあります。

文字形式での命令(コマンドライン)を利用した、カーネルとの接点(インターフェース)をユーザーに提供してくれているプログラムであるからこそ、そのように呼ばれます。

ユーザーはカーネルを包んでいるシェルを仲介することで、カーネルに命令を出すことができるのです。

ユーザーとカーネルを仲介するシェル

このままでは、ユーザーとカーネルとシェルの3者の関係性が、まだまだイメージしづらいかもしれません。

ユーザーカーネルシェルを、現実世界のレストランでのお客さんシェフホールスタッフに置き換えてみることで、イメージをもう少し具体的なものにしていきましょう。

私たちはレストランでお客さんとして、調理をしてくれているシェフと直接コミュニケーションを取らずに、料理を注文することができます。これは私たちとシェフとの間をホールスタッフが仲介してくれているからですよね。つまりは、ホールスタッフが、私たちとシェフとのインタフェース(接点)になってくれているのです。

インターフェースとして機能するホールスタッフ

シェフをカーネルに、ホールスタッフをシェルに置き換えてみると、シェルの見え方が少しだけ変わってくるのではないでしょうか。

シェルの具体的な役割

シェルの具体的な役割は大きく2つに分けられます。

1) ユーザーが入力した命令を、カーネル(心臓部)に伝達する

ユーザーの命令をカーネルに伝達するシェル

2) カーネル(心臓部)からの返答を、ユーザーに伝達する

カーネルの返答をユーザーに伝達するシェル

ところで、ユーザーとカーネルとの間をなぜシェルが仲介する必要があるのでしょうか?ユーザーが直接カーネルとやり取りをすればシェルは必要ないのではないでしょうか?

ユーザーがシェルに命令を送る手助けをしてくれるプログラムであるターミナルエミュレーター(以下ターミナル)と、 ls(エルエス)という頻繁に使われるコマンド(命令)を例にして、シェルの必要性について見ていきましょう。

lsというコマンド名は、日本語で「一覧」という意味を持つ英単語である「list(リスト)」に由来しています。lsとターミナル上で入力すれば、ファイルとディレクトリの一覧が英語で出力されます。

こちらはmacOSでターミナル(Terminal.app)を起動して、ホームディレクトリでlsコマンドを実行している例です。

このように、ターミナル上では英語に近い形で命令を入力し、出力も英語で返ってくることが多いですね。ユーザーである人間にとって理解しやすい英語という形で、OSを操作できることはとても便利なことです。

しかし実は、カーネルはユーザーが使用する英語といった言葉を理解できません。カーネルが理解することができるのは
機械語のみです。機械語とは、0と1のみの数字を利用した2進法により表現を行うプログラミング言語です。

このような背景から、ユーザーがカーネルに対して直接命令を出してもカーネルは混乱してしまいます。

混乱しているカーネル

また、カーネルからの返答をユーザーが直接受け取っても、ユーザーが同じように混乱してしまいます。

混乱しているユーザー

ここで、シェルの出番です。シェルがユーザーとカーネルとの間に入って、それぞれの言葉を通訳してくれれば、ユーザーはカーネルとコミュニケーションを取ることができます。

円滑なコミュニケーションを実現してくれているシェル

英語に近い形でカーネルに命令を出すことができて、カーネルからの返答も英語で見ることができるのは、シェルがユーザーとカーネルとの間に入って通訳者として活躍してくれているからなのです。

このような役割から、シェルCommand-Line Interpreter(コマンドラインの通訳者)とも呼ばれることがあります。

ポイント
  1. シェルはユーザーとカーネルとの間に入って、命令と返答を伝達しています。
  2. カーネルはユーザーからの命令を直接は理解できないため、シェルが翻訳しています。
  3. シェルはその役割から、Command-Line Interface(コマンドライン・インターフェース)Command-Line Interpreter(コマンドライン・インタープリター)、略してCLI(シーエルアイ)とも呼ばれます。

シェルを見るには?

「百聞は一見にしかず」ということわざがあるくらいですから、シェルを見たい人も多いでしょう。

しかしながら、シェルを直接見ることはできません。なぜならば、シェルはウェブブラウザやテキストエディターのように、視覚的なウィンドウを画面上に表示する機能を持ったプログラムではないからです。

ディスプレイ上の視覚的なウィンドウ

それでも、シェルを間接的に見る方法はあります。シェルを間接的に見る最も簡単な方法は、ターミナルを使用することです。

起動したターミナルのウィンドウ上にプロンプトが表示されていれば、間違いなくシェルが起動していることを示しています。

macOSでターミナル(Terminal.app)を起動した先ほどの例では、%記号がプロンプトにあたります。

ターミナルのウィンドウ上に表示されているプロンプト

ちなみに、prompt(プロンプト)とは日本語で促(うなが)すという意味の英単語です。シェルが私たちに、命令を出すように促してくれている合図がプロンプトなのです。

シェルの種類

UNIXや、UNIX系OSで利用できるシェルにはたくさんの種類が存在します。現在でも使われるシェルのうち、頻繁に紹介されるものは、おおよそ10種類程度です。

シェルの種類が異なっていても、cdlsといったコマンドは変わらずに使えることがほとんどです。ユーザーの文字入力を補助するような、副次的な機能がシェルによって異なってきます。

今回はbashzshfishという3つのシェルを紹介します。

なお、シェルには対話形式(interactive mode)とスクリプト形式(scripting mode)での2種類の利用方法がありますが、スクリプト形式での利用方法については触れません。

bash (Bourne Again Shell)

1989年に初代バージョンが発表されました。

バージョン10.3から10.14までのmacOSと、多くのLinuxディストリビューションにおいて、デフォルトのログインシェルとして使われています。

先代のシェルに搭載されていた、パイプライン(|)を利用した標準ストリームの接続や、バッククォート(``)を利用したコマンド置換などに加えて、アスタリスク(*)を利用したパス名展開や、カーリーブレース({ })を利用したブレース展開、コマンド入力補完などが新たに組み込まれました。

標準ストリームの接続( | )

パイプライン以前のコマンドの出力結果(標準出力)を、パイプライン以降のコマンドの引数(標準入力)として使用できます。

標準出力と標準入力の接続

コマンド置換( ` ` )

バッククォート内に記述したコマンドの出力結果を、他のコマンドの一部として置き換えることができます。

コマンド置換

パス名展開( * )

パス名の末尾の記述をアスタリスクで抽象化することで、指定した文字列から始まるパス名に置き換えた上で、コマンドを実行できます。

パス名展開

ブレース展開( { } )

カーリーブレース内に文字の範囲を指定すると、すべてのパターンの文字列を自動生成した上でコマンドを実行できます。

ブレース展開

コマンド入力補完( tabキー )

コマンド名や引数として渡すパス名の入力を補完できます。


コマンド入力補完
新規タブではじめから見る

zsh (Z Shell)

1990年に初代バージョンが発表されました。

バージョン10.16以降のmacOSにおいて、デフォルトのログインシェルとして利用されています。

現在では、bashと多くの側面で後方互換性を有しているため、bashの機能の多くはzshにも組み込まれています。

bashと比較すると、膨大な新機能が追加されていて、2020年時点での公式マニュアルは26章立てで構成されるほどの分量です。

設定ファイルである.zshrc内の記述次第では、例えば以下のような機能が実現できます。

cdコマンド省略

ディレクトリ名を指定するだけで、カレントディレクトリを変更できます。

cdコマンド省略をしている様子

ファイル名生成( ** , tabキー)

コマンド入力時に、引数として渡す正確なパス名を把握していなくても、生成をすることができます。

ファイル名生成は、親ディレクトリ名/**/目的のディレクトリ名・ファイル名という形式の抽象的な記述をもとに、親ディレクトリ内から目的のディレクトリ名・ファイル名を見つけ出すことによって実現されています。


ファイル名生成をしている様子
新規タブではじめから見る

コマンド修正

コマンド名を誤って入力した際に、正しいコマンド名に変更した上で実行できます。

コマンド修正をしている様子

コマンド入力補完(tabキー)

コマンドに渡す引数がパス名でなくとも、入力を補完できます。


コマンド入力補完をしている様子1
新規タブではじめから見る

コマンドに渡すオプションの入力も補完できます。


fish (Friendly Interactive Shell)

2005年に初代バージョンが発表されました。

bashzshが満たしているPOSIXに準拠していない、ひと味変わったシェルです。

変数、関数、配列、制御構文などの、対話形式での使用の際には使用頻度が少ない機能に独自性が見られ、スクリプト形式での使用の際に、他のシェルとの違いを大きく実感します。

対話形式での使用においては、以下のような機能がデフォルトの状態で使用できます。

オートサジェスチョン

一文字入力するたびに、シェルが予測したコマンドが、入力している文字に重ねて表示されます。

入力したいコマンドとサジェストされたコマンドが同じならば、→(右矢印)キーで入力補完をすることができます。


オートサジェスチョン
新規タブではじめから見る

シンタックスハイライト

入力しているコマンドに誤りがあると、文字色が赤くなり、正しければ、文字色が青くなります。

シンタックスハイライト

ウェブブラウザでの設定変更

ウェブブラウザを利用して、様々な設定を簡単に変更することができます。


ウェブブラウザでの設定変更
新規タブで拡大して見る

どの種類のシェルを使えばいいのか?

macOSでは、バージョン10.3から10.14まではbash、10.15からはzsh、多くのLinuxディストリビューションではbashがデフォルトのログインシェルです。

多くの人にとって、macOS以外のUNIXや、Linux以外のUNIX系OSに触れる機会は少ないです。

状況によっては自分の好みのシェルが使えないことも考えられますので、bashzshをログインシェルとして使用して慣れておくことが望ましいでしょう。

現在のログインシェルの種類を確認するには、ターミナルで以下のコマンドを実行してみましょう。

ターミナル | ログインシェルの種類を確認しよう
1
2
$ echo $SHELL
/usr/local/bin/bash

bashzshのパスが表示されれば問題ありません。

この記事のまとめ

  • シェルは、私たちがキーボードで記述した命令を、OSの心臓部であるカーネルに翻訳し伝達してくれている
  • シェルはその役割から、Command-Line Interface(コマンドライン・インターフェース)Command-Line Interpreter(コマンドライン・インタープリター)、略してCLI(シーエルアイ)とも呼ばれる
  • シェルにはbashzshfishなどの種類がある