はじめに

サメさん〜、ちょっとLinixの勉強してて聞きたいことがあるんだ〜。

おお、なんでも聞いてよ!

シェルってなんなのかわからなくなっちゃって。。。
ターミナルのことかと思っていたんだけど、どうやら違うみたいでさ〜

そういった細かなことを理解しようとするのとても重要だと思う!
分かった。今回はシェルについて解説していこう!
シェルってなに?

シェルって言うのは端的に言うと、
カーネルのインターフェースになっているソフトウェア
のことだよ。

○ンタッキーフライドチキンのおじさんの作ってくれるソフトクリーム??

こらこら。
ケン○ッキーは美味しいけど違う!

要はクライアント(ユーザーと)Linuxカーネルの仲介役ってことなんだ。

クリーニング屋さんをイメージしてみるといいかも。。
クリーニング屋さんのお姉さんに綺麗にしといてください!って頼んだ時を想像して。
お姉さんがシェルだよ。

ふむふむ。

お姉さんは洗濯物受け取ったら、次は業者さんに汚い洗濯物渡して、綺麗になって返ってきたもの受け取る。

業者さんが出てきた。
もしかしてこれがカーネル?

その通り!
最後に綺麗になった洗濯物をお姉さんはクマくんに返してくれる。
重要なポイントとしては綺麗にする処理そのものはお姉さんじゃなく、業者さんがやっていると言うことなんだ。
シェルの役割

実際にターミナルにdateコマンドを打った時の一連のLinux内部の中の処理を抑えていこう。
①キーボードから入力された”date”と言う文字列を受け取る。
②dateと言うコマンドを探す。
③見つかったコマンドを実行する。
④実行した結果、得られた値を画面に表示する。

この③の部分をLinuxカーネルが担当している。
つまりシェルは残りの①,②,④を行っていて、
シェルの役割とは、情報を受け取り、誰に渡すか探索し、結果を受け取って画面に表示することなんだよ。

なるほど!
確かに仲介役っぽい!

Linuxカーネルを包み込むような動きをするからシェル(殻)って呼ばれているみたいだよ。
ユーザーがLinuxを操作するためには必ずシェルを通さなきゃいけない。
Linuxをマスターするためにはシェルについて理解を深めていなければいけないんだ!
対話型(インタラクティブ)操作とシェルスクリプト

シェルの使い方には
対話型とシェルスクリプトがあって、それを説明するね。

知りた〜い!
対話型(インタラクティブ)操作

まず対話型なんだけど、通常ターミナルにコマンドを叩いて結果を呼び出すことだよ。
以下のような感じかな。
$ date
=>現在の日時が返ってくる
$ echo $SHELL
/bin/bash

ユーザーがキーボードと画面を利用して直接シェルを操作する方法を対話型(インタラクティブ)操作と呼ぶんだ。

なるほど。
そしたら僕はよく対話型でシェルを操作していたんだなぁ。
シェルスクリプト

実行したいコマンドを事前にファイルに記述しておいて、そのファイルをシェルに指定することで、記述した全部のコマンドをまとめて実行することもできるんだ。
一連の操作の流れを記述したファイルのことをシェルスクリプトって呼ぶんだよ。

おおお!
そんな便利なことが!
予約しておけるってことだね。

そうなんだ!
シェルスクリプトは単なるテキストファイルだからvimとか編集して中身を書き換えたり、見ることもできるよ。
#!/bin/bash#!/bin/bash#!/bin/bash
open https://github.com/
open https://www.amazon.co.jp/

githubとamazonを開くためのスクリプトだけど、こんな感じで用意しておいてシェルスクリプトを実行すれば、同時にタブを2つ出すことができる。

おお!!
めちゃくちゃ便利そうな匂い・・・

いずれシェルスクリプトをバンバン書いて作業効率上げていこうね。
シェル一覧

どんなシェルがあるのか整理してみるね。
シェル | 内容 |
sh | 最も古いシェル。 長い歴史を持っているためシェルスクリプトを書くときに一般的に使われる。 対話型としての機能が少なくログインシェルとしては不向き。 |
csh | Cシェルと呼ばれ、shと同じく古くからあるシェル。 shと比べて対話型の機能が拡張されたため、人気が出たけど、シェルスクリプトを書くうえで致命的な欠陥があり、後継のtcshがあるので今は使われていない。 |
bash | shを基本として機能を拡張したシェル。 対話型としての機能も拡張され、一般的なパソコンにログインシェルとして入っている。 対話型としてもシェルスクリプトを書く上でも文句なしスタンダードシェル。 |
tcsh | cshの後継として開発されたCシェル。 対話型で便利な機能を持っているが、cshと同じくシェルスクリプトを書くのは苦手。 |
zsh | 比較的新しいシェルでbashやtcshの機能をいっぱい取り込んだ新規精鋭のシェル。 機能面では他のシェルを圧倒している。 機能が多すぎて慣れるまでは時間がかかり、初心者には不向きかも。 |
fish | こちらも比較的新しいシェル。 デフォルトでbashより使いやすい感じなのでzshより初心者向き。 他のシェルでも使えるTabでの補完やシンタックスハイライトを強化しているだけなので、特別に新しいことを覚える必要がない |

どのシェルがいいんだろう。

①スタンダードなbash。
②新しい機能が盛りだくさんなzsh。
③初期の状態でbashより見た目や機能が整っているfish
の3択あると思うけど、初心者はbashでいいと思う。

えーなんで!
機能もりもりの方が良くない?

bashのおすすめポイントを整理するね!
- Linuxでデフォルトのログインシェルとして採用されており、利用する機会が多い。
- 対話的にもシェルスクリプトを利用するにも十分な機能を持っている。
- shとの後方互換性を持つため、既存のsh用のシェルスクリプトをそのまま利用できる。
- 利用者が多く、書籍やWebから情報を集めやすい。


なるほど。情報が集めやすいってだけでもメリットに感じるね。

いつでもシェルは切り替えることはできるから最初はbashで後から好みに合わせて変えればいいと思う!
【番外編】カーネルとシェルが分離している理由

なんでカーネルとシェルって分かれているんだろう?
別にカーネルがシェルみたいな役割も持ってていいと思うんだけど。

良い指摘だね。
ただ、Linuxには「1つのプログラムには、1 つのことをうまくやらせろ」って考え方があるんだ。
1つのプログラムにあれもこれも機能を詰め込まないで、機能ごとにプログラムを分離しておくことがソフトウェア開発には重要なことなんだよ。

そうなんだ。。。
具体的には今回の場合だとどんなメリットがあるんだろう。

そうだなぁ、以下の3つくらい考えれるかな。
①Linuxカーネルを変更することなく、シェルだけを自分好みに変更することができる。
②Linux以外のOSを利用するときもシェルが移植されていれば操作を同じように行うことができる。
③シェルがエラーを起こしたり、高負荷状態になってクラッシュしたとしてもOS本体である Linuxカーネルへの影響を最小限に抑えることができる。

Webアプリケーションもよく分離して開発すると思うんだけど、効率やリスクを考えたら分離した方がいいねってなるんだ。
ターミナルの役割

サメさん、ありがとう!
とてもよくわかったよ!

よかった!
そう言ってもらえると嬉しいよ。

ターミナルほんと優秀だなぁ。

あ、ターミナルが優秀っていうわけじゃなくてシェルが優秀なんだけどね。
ターミナルとシェルは全くの違うソフトウェアだよ。

あ、ちょっとそこの部分怪しいかもしれない。。。

混同されやすいからね・・・
ターミナルっていうのは入出力の画面を提供するだけのソフトウェアであって、ターミナルの画面の中でシェルが動いているということだよ。

微妙な認識違いだったよ・・・

それぞれどういう役割があるのかを正しく認識するのは大事だからね。
他の人と話すときに齟齬が生まれちゃうから。

今回でバッチリ抑えたよ!
ありがとう!!
終わりに

知らなかった知識がたくさんあるなぁ。

今回でシェルっていうものがどんなものかもわかったと思う。
対話型操作でパソコンの操作ができるようになって、いずれはシェルスクリプトを書いてサーバーをいじれるようになりたいね!

その道は遠そうだけど・・・。

スーパーエンジニアを目指すために頑張ろう!

よっしゃ〜!!

いいね!
それじゃあ今日のまとめをしておこう!
- シェルとはLinuxカーネルとユーザーの仲介役。
- シェルの操作は対話型とシェルスクリプトでの操作がある。
- ターミナルは入出力画面であり、ユーザーがシェルに連絡するための道具である。


シェルについての勉強のおすすめ本だよ。