更新日:
【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(コマンドラインの通訳者)とも呼ばれることがあります。
シェルを見るには?
「百聞は一見にしかず」ということわざがあるくらいですから、シェルを見たい人も多いでしょう。
しかしながら、シェルを直接見ることはできません。なぜならば、シェルはウェブブラウザやテキストエディターのように、視覚的なウィンドウを画面上に表示する機能を持ったプログラムではないからです。
それでも、シェルを間接的に見る方法はあります。シェルを間接的に見る最も簡単な方法は、ターミナルを使用することです。
起動したターミナルのウィンドウ上にプロンプトが表示されていれば、間違いなくシェルが起動していることを示しています。
macOSでターミナル(Terminal.app)を起動した先ほどの例では、%
記号がプロンプトにあたります。
ちなみに、prompt(プロンプト)とは日本語で促(うなが)すという意味の英単語です。シェルが私たちに、命令を出すように促してくれている合図がプロンプトなのです。
シェルの種類
UNIXや、UNIX系OSで利用できるシェルにはたくさんの種類が存在します。現在でも使われるシェルのうち、頻繁に紹介されるものは、おおよそ10種類程度です。
シェルの種類が異なっていても、cd
やls
といったコマンドは変わらずに使えることがほとんどです。ユーザーの文字入力を補助するような、副次的な機能がシェルによって異なってきます。
今回はbash
、zsh
、fish
という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コマンド省略
ディレクトリ名を指定するだけで、カレントディレクトリを変更できます。
ファイル名生成( ** , tabキー)
コマンド入力時に、引数として渡す正確なパス名を把握していなくても、生成をすることができます。
ファイル名生成は、親ディレクトリ名/**/目的のディレクトリ名・ファイル名
という形式の抽象的な記述をもとに、親ディレクトリ
内から目的のディレクトリ名・ファイル名
を見つけ出すことによって実現されています。
コマンド修正
コマンド名を誤って入力した際に、正しいコマンド名に変更した上で実行できます。
コマンド入力補完(tabキー)
コマンドに渡す引数がパス名でなくとも、入力を補完できます。
コマンドに渡すオプションの入力も補完できます。
fish (Friendly Interactive Shell)
2005年に初代バージョンが発表されました。
bash
、zsh
が満たしているPOSIXに準拠していない、ひと味変わったシェルです。
変数、関数、配列、制御構文などの、対話形式での使用の際には使用頻度が少ない機能に独自性が見られ、スクリプト形式での使用の際に、他のシェルとの違いを大きく実感します。
対話形式での使用においては、以下のような機能がデフォルトの状態で使用できます。
オートサジェスチョン
一文字入力するたびに、シェルが予測したコマンドが、入力している文字に重ねて表示されます。
入力したいコマンドとサジェストされたコマンドが同じならば、→(右矢印)
キーで入力補完をすることができます。
シンタックスハイライト
入力しているコマンドに誤りがあると、文字色が赤くなり、正しければ、文字色が青くなります。
ウェブブラウザでの設定変更
ウェブブラウザを利用して、様々な設定を簡単に変更することができます。
どの種類のシェルを使えばいいのか?
macOSでは、バージョン10.3から10.14まではbash
、10.15からはzsh
、多くのLinuxディストリビューションではbash
がデフォルトのログインシェルです。
多くの人にとって、macOS以外のUNIXや、Linux以外のUNIX系OSに触れる機会は少ないです。
状況によっては自分の好みのシェルが使えないことも考えられますので、bash
かzsh
をログインシェルとして使用して慣れておくことが望ましいでしょう。
現在のログインシェルの種類を確認するには、ターミナルで以下のコマンドを実行してみましょう。
1
2
$ echo $SHELL
/usr/local/bin/bash
bash
やzsh
のパスが表示されれば問題ありません。
この記事のまとめ
- シェルは、私たちがキーボードで記述した命令を、OSの心臓部であるカーネルに翻訳し伝達してくれている
- シェルはその役割から、Command-Line Interface(コマンドライン・インターフェース)、Command-Line Interpreter(コマンドライン・インタープリター)、略してCLI(シーエルアイ)とも呼ばれる
- シェルには
bash
、zsh
、fish
などの種類がある