シェル(Shell)とは

シェル/bash 用語解説

シェルについて調べる人
「シェルってなんでしょうか?具体的に、簡単な使い方も知りたいです。開発の現場では、シェルをどういう時に使うのでしょうか。」

こんな悩みを解決します。

シェルはコマンドを実行するためのインターフェースす。UnixやLinuxにはもともとWindowsやMacのようにマウスで操作するグラフィカルなインターフェースがなく、シェルを用いてコマンドを打ち込んで使っていました。

ターミナル上のシェルからのコマンド実行例
ターミナル上のシェルからのコマンド実行例

入力したコマンドがOSで実行されるまでの処理イメージ
出典:シェルの概念と機能 
OS、カーネル、シェルの関係

最近ではWindowsやMacでも使えるようになっています。

本記事の内容(シェルとは・・・)

この記事を書いている私は社会人歴12年のITエンジニアです。現在の年収は1,000万円ちょっと。

実務経験を踏まえ、シェルとは何かを解説します。シェルについて調べている人の助力になりましたら幸いです。

シェルはOSと会話するための言語

シェルはOSと会話するための言語

シェルトはもともと、OSとユーザが会話するために作られた簡易的なコミュニケーションツールです。

シェルは、グラフィカルな操作ができるようになった今も、サーバのメンテナンスやバッチ処理のために広く使われています。

シェルの種類

以下に主なシェルを挙げます。なお、Linuxの標準シェルはbash(Born Againシェル)です。

Born Againシェル(/bin/bash)

オススメ度:★★★★☆

bashはそれ以前に存在したBourneシェル(コマンド名は「sh」)の後継として開発され、その名称は “Bourne” (開発創始者の姓)と “Born Again” (「新生」の意)をかけたものとも言われる。コマンド構文など基本的な仕様はBourneシェルの上位互換となっており、古いコマンドやシェルスクリプトなどはそのまま実行できる。

また、Kornシェル(ksh)やCシェル(csh)などの持つ要素も取り入れられ、コマンド履歴やコマンド名の自動補完など今日では標準的に使われる多くの機能を実装している。

出典:IT用語辞典 

Tenex/Tops-20 Cシェル(/bin/tcsh)

オススメ度:★★★☆☆

tcsh(ティーシーシェル)とは、コマンドシェルのひとつで、Unix系オペレーティングシステムで使われている。csh(シーシェル)のユーザーインターフェースの部分を中心に拡張されたシェルのことで、cshとの上位互換を持っている。
このcshはC言語に似た文法特性を持っており、ヒストリ編集などに優れている。また、簡単なC言語ソースコードの文法チェックにも使われる場合もある。
Unix系OSで用いられている他のシェルと比較し、NLS(Native Language System)など国際化対応に素早く対応することで知られている。
tcshの頭文字は、TENEXならびにTOPS-20に由来しているとされる。tcshは、Free BSD 4.1-RELEASE以降に標準シェルとして組み込まれ、その流れを汲むMac OS Xでも組み込まれている。バージョン10.2まではtcshがデフォルトだったが、10.3以降はbashがデフォルトのシェルとなった。

出典:IT用語辞典 

Zシェル(/bin/zsh)

オススメ度:★★★★★

Z shellはUnixのコマンドシェルの1つである。 対話的なログインコマンドシェルとしても、強力なシェルスクリプトコマンドのインタープリターとしても使うことができる。 zsh は数多くの改良を含んだBourne Shellの拡張版という見方もできる。

出典:Wikipedia 

Bornシェル(/bin/sh)

オススメ度:★★☆☆☆

Bourneシェルとは、多くのUNIX系OSで標準的に用いられるシェルプログラムの一つ。標準の実行プログラムファイル名(コマンド名)は「sh」。
BourneシェルはUNIX Version 7を利用するためのシェルとしてStephen Bourne(スティーブ・ボーン)氏が1977年に開発した。

出典:IT用語辞典 

Cシェル(/bin/csh)

オススメ度:★☆☆☆☆

シェルスクリプトの制御構文にC言語風の語彙や文法を採用したことで一時人気を博したが、関数定義機能の欠如など機能面での問題や、異なる構文を採用したBourneシェル(sh)やその互換シェルが標準として多くのシステムに組み込まれたことなどから、csh系のスクリプト構文はあまり普及しなかった。

出典:IT用語辞典 

Kornシェル(/bin/ksh)

オススメ度:★☆☆☆☆

kshは1983年、AT&T社のUNIX System Vで利用するために同社ベル研究所(当時)のDavid Korn(デビッド・コーン)氏によって開発された。

それ以前に人気の高かったBourneシェルの上位互換となっており、同シェル向けのシェルスクリプトなどはそのまま実行できる。一方でこれとは別の系統のcsh(C Shell)の機能の多くを取り入れ、コマンドの履歴(ヒストリ)の呼び出しや文字列の別名(エイリアス)の設定など、対話的に操作する際に便利な機能が用意されている。

kshの仕様はUNIXの標準規格であるPOSIXの一部として取り込まれた。AT&T社の商用UNIXの一部として開発されたためソースコードなどは長らく非公開だったが、2000年にオープンソースソフトウェアとして公開された。

出典:IT用語辞典 

シェルスクリプトとは


シェルスクリプトは、LinuxやUnixで用いられている簡易的なプログラミング言語です。

シェルスクリプトを使うと、カーネルに対して発行するコマンドを束にして命令することができます。

まずは1つ1つ個別にコマンドを実行した例です。
シェルからのコマンド実行例(lsとcpコマンド)
シェルからのコマンド実行例
これらのコマンドを1つのファイルに束ねたシェルスクリプトは以下の通りです。

シェルスクリプトのコーディング例1

上の例では、次の一連の処理を行なっています。一行目の「#!/bin/bash」については後ほど解説することとし、2〜4行目の①〜③について解説します。

  • ①ファイル一覧を取得
  • ②file1.txtをコピーして、backup.txtを作成する
  • ③コピー後、ファイル一覧を再取得

ファイルを保存して実行すると権限(Permission)エラーとなってしまいます。
permission denyエラーとなる

chmodコマンドを用いて、シェルスクリプトファイルに実行権限を付与します。
chmodでシェルスクリプトに実行権限を付与する

無事実行できました。

#!/bin/bashってなに?

シェルスクリプトのコーディング例2

先ほどの例の1行目の#!/bin/bashってなんでしょう。

これは、「/binディレクトリにあるbashを使ってスクリプトを実行しろ」という意味です。

実はLinuxでは様々なスクリプトファイルがあり、代表的なものはbashやtcshです。それ以外にも複数のシェルがありますし、シェルスクリプト以外にもawkなど様々なスクリプト言語があるのです。

Windowsでは.txtや.htmlなどの拡張子でどのプログラムでそのファイルを実行するか決定しますが、Linuxではスクリプトファイルの1行目に書かれたプログラムでスクリプトを実行します。

ルール:Linuxのスクリプトファイルは、1行目に「#!」+「スクリプトを実行するプログラムのパス」を記述するのがルールです

ですから、先の例のスクリプトをbashではなくtcshで処理したい場合には次のように記述します。(tcshでも実行結果は変わりません。)

シェルスクリプトのコーディング例3

シェルスクリプトのデバッグ

シェルスクリプトを開発するときに便利なのがデバックモードです。シェルスクリプトファイルの実行結果を、1行1行表示してくれます。

やり方は簡単で、bashやtcshなどのシェルを指定して、-xオプションとシェルスクリプト名を引数にして実行します。

シェルスクリプトのデバック実行結果
シェルスクリプトのデバッグ

開発現場でシェルスクリプトはどのような目的で使われているか?

開発現場でシェルスクリプトはどのような目的で使われているか

なぜシェルスクリプトを使うのか?

ファイルのコピーなら、windowsのエクスプローラでもできます。ではなぜIT企業ではシェルスクリプトを使うのでしょうか?理由は簡単、エクスプローラよりもシンプルだから。具体的に解説します。

理由1:自動実行しやすい

手でその都度作業するならエクスプローラでやればいいのですが、日次や週次など定期的に動かしたい処理は自動化したいです。そういった場合、シェルスクリプトが有効です。また、このような定期・不定期の自動実行処理のことをバッチ処理と呼びます。

人間の手を介さずに操作しますので、グラフィカルな画面は不要で必要なコマンドだけを記述した方がシンプルで間違いが起きにくいのです。

バッチの自動実行にはジョブスケジューラやcronを使います。
参考:バッチ・ジョブスケジューラの解説
参考:cronの解説(外部リンク)

理由2:再利用性が高い

シェルスクリプトはコマンドだけのシンプルな命令なので、再利用性が高いです。

例えばサーバAで行なっているバックアップ処理をサーバBに移植したり、社内で標準的に使われるバッチ処理を整備して各システムに展開することも可能です。

例1:製品やハードウェアの再起動

シェルスクリプトは、ApacheやTomcatに代表されるサーバ製品の再起動や、OSそのものの再起動を実行するのによく用いられます。

例2:複数のファイルを圧縮してバックアップする

WEBサーバやAPサーバをはじめとして、様々なサーバのログを圧縮してバックアップする際、シェルスクリプトが使われることが多いです。また圧縮せずに、ファイル名をバックアップ用にリネームだけする処理もよく用いられます。

例3:データベースの更新

定期的なデータベースのメンテナンスにもシェルスクリプトがよく使われます。例えばテーブルの再定義や、不要なレコードの削除、更新などです。

これらはデータベースを操作するための言語であるSQLが用いられますが、シェルスクリプトからSQLが実行されるのが一般的です。

また、シェルスクリプトの代わりにJavaなどが用いられることもあります。

実践的なシェルスクリプトの例

簡素なシェルスクリプトしか例示してませんでしたので、実践的な例として複数のLinuxディレクトリ領域をNASにバックアップする例を示します。

この例のように、コマンドだけではなく変数(下例におけるbackup_filesやdest,dayなど)を用いて、汎用的なスクリプトを作成する事が可能です。

シェルスクリプトのコーディング例4

今回は以上です。シェルスクリプトについて解説しました。開発の現場では、シェルスクリプトはジョブスケジューラから実行されて使われるのが一般的です。

ジョブスケジューラについてはこちらの記事をご覧ください。

参考:バッチ処理の例とその解説【バッチ歴12年のSEが超初心者向けに解説】

学習にはLinuxを用いるのが一般的ですが、Macにも標準で使えます。Windowsの場合はセットアップが必要です。また、Raspberry piにraspbianというフリーのLinuxを導入することができ、1万円程度でコンパクトで最新のLinuxマシンが手に入るのオススメです。参考になりましたら幸いです。