メジャーなものからマイナーなものまで、さまざまなプログラミング言語が世の中にあり、プログラミング言語ごとに歴史や物語があります。
今回は、身近だけど奥が深いShell script(シェルスクリプト)の世界について見ていきたいと思います。そもそも「Shell script(シェルスクリプト)とはなにものか?」という話をしたいと思います。
まずは“Shell script(シェルスクリプト)”の前半部分であるShell(シェル)について考えていきたいと思います。
Shellというのは“基本ソフト(OS)に対して指示を出すためのインターフェイスを提供するソフトウェア”のことです。
この文章だけではピンとこない方も多いと思うので、具体的に言えば、Windowsのcmd.exe(コマンドプロンプト)はまさにシェルです。
cmd.exeを起動して、ipconfigと入力してエンターを押すと、そのコンピューターが持っているIPアドレスなどネットワーク関連の構成情報が出てきます。
このように、cmd.exeなどのシェルには“利用者がOS内部の情報にアクセスするためのインターフェイスとして機能があり”、“利用者のうち込んだコマンドに対する応答機能がある”のです。
ちなみに、Windowsのシェルにはcmd.exeという名前が付いていますが、UnixやLinuxのシェルは単にシェルとしか呼ばれません。
前半のShellの意味がわかったところで、“Shell script(シェルスクリプト)”の後半部分であるscriptについても確認しましょう。
scriptとはスクリプト言語のことです。
スクリプト言語とはなにかということですが、ざっくり言ってしまうと、「プログラマーにとって取り扱いが簡単なプログラミング言語」の総称です。
スクリプト言語と認められているプログラミング言語には、JavaScriptやVBScriptなど名前にscriptが入っているものだけでなく、PHPやPythonやGo言語などscriptという名前が入っていないものもあります。
さらに言うと、 スクリプト言語の定義は“プログラマーにとって取り扱いが簡単な言語”のことですが、なにをもって、プログラマーにとって扱いやすいとするか、その基準は曖昧だったりします。
では、Shell script(シェルスクリプト)の場合どういうところがプログラマーにとって扱いやすいかというと、記述が比較的簡単かつ、コンパイルの必要性がないため実行も簡単だからです。
※コンパイルとは、人間がプログラミングしたソースコードを、0と1しかわからない機械でも理解できるように、翻訳することを言います。
つまるところ、Shell script(シェルスクリプト)とはシェルに対して動作する取り扱いが簡単なプログラミング言語ということです。
ところで、みなさん、バッチファイル(.bat)を見たり、使ったことがありますか?
実は、バッチファイルはWindows版Shell script(シェルスクリプト)なのです。
そのため、本来“Shell script(シェルスクリプト)”はUnixやLinuxなどのシェル向けに書かれたもののことを言うのですが、同じ役割を持つWindowsのcmd.exe向けに書かれたバッチファイルのことを含めて“Shell script(シェルスクリプト)”と呼ぶ人もいます。
Shell script(シェルスクリプト)は記述が比較的容易とお伝えしましたが、実はShell script(バッチファイル)のコードというのは、ipconfigのような、Shellに打ち込むコマンドで構成されています。
ここから、いよいよShell script(シェルスクリプト)の歴史について、見ていきたいと思います。
まず理解していただきたいのは、Shell script(シェルスクリプト)の歴史はShellの歴史と紐づいており、それはつまるところOSの歴史でもあるのです。
そもそも、“シェル”はUNIXの前身にあたるOSであるMulticsで登場したものであり、Multicsのシェルにもシェルスクリプトの概念があったようですが、Multics自体が商業的には大失敗に終わったため、シェルスクリプトが一般的になったのはMulticsの後進であるUnix登場以降です。
世界初のUnixシェル“Thompson Shell”が1971年に登場しますが、すでにこのシェルはシェルスクリプトに対応しており、実際に“Thompson Shell”向けにシェルスクリプトが書かれていたようです。
ただし、この最初のUNIXシェルはMulticsのシェルの延長線上にあり、スクリプトの本格的な利用には向いていないという批判が沸き起こり、1975年には改良型の“PWB Shell”(“Mashey Shell”とも)が登場しています。
“PWB Shell”は“Thompson Shell”の改良版ですが、互換性を維持するために限定的な改良であり、依然として扱いにくさが残る状況でした。
そこで1979年に登場したUNIX Version 7 に搭載されたのが、根本的に設計を見直し、シェルスクリプトの利用性が格段に向上した“Bourne Shell”です。
この当時、シェルスクリプト以外のプログラミング言語といえば、C言語などコンパイルが必要な言語など、手軽に使える言語がないこともあり、シェルスクリプトの利用が劇的に広がりました。
1985年には時代のニーズに応える形で『UNIXプログラミング環境』という、シェルスクリプトに言及した初の商業書籍も出版されています。
ちなみに“Bourne Shell”は2000年以降においても、Unix・Linuxシェルのデファクトスタンダードとなっています。
このようにUnix・Linuxシェルの完成に伴い、シェルスクリプトの利用が広がったわけですが、同時にシェルスクリプトの問題点も浮き彫りになってきました。
具体的には以下の二つです。
①シェルスクリプトは結局のところ、“シェルのコマンド集”であり、複雑な処理には対応できない。
②“PWB Shell”用に書かれたシェルスクリプトは“Bourne Shell”では動かないなど、互換性の問題がある。
その問題点の解決策とし1987年に開発されたのが、プログラミング言語Perlです。
PerlはC言語のようにコンパイルする必要はないけれど、コマンド集であるシェルスクリプトより簡単に高度なことができるうえに、シェルの互換性だけでなく、LinuxだとかWindowsだといったOSの違いすら意識しなくて良いのです。
結果、Perlが大人気になりましたが、それはまた別の話なので、ここではこれ以上触れません。
ついでなので、Windows版シェルスクリプトである、バッチファイルの互換性問題についても言及しておきましょう。
MicrosoftのOSは1981年登場のMS-DOSに始まり、WindowsやIBMと共同開発していたOS/2へと派生していきますが、いずれのOSにおいてもバッチファイルが利用できます。
ただし、上ではWindowsのシェルはcmd.exeと書きましたが、正確に言えば“Windows2000やWindowsXPから始まり現行のWindows10にも連なるWindowsNT系のシェルは”であり、MS-DOSやOS/2、Windows98やWindowsMeなどいわゆるWindows9x系OSのシェルはcommand.comです。
WindowsNT系とWindows9x系ではカーネルと呼ばれる、OSのコアとなる部分が大きく異なるため、シェルも変更になったようです。
一応、Microsoftではcmd.exeに対してcommand.comへの下位互換を付与しているとうたっているため、command.com用のバッチファイルも動作するようですが、あまり期待しない方が良いと思います。
少なくとも、私はお客様のユーザー部門に「バックアップ作成用にずっと使っているバッチが急に動かなくなったから見てくれ」と頼まれて確認したところ、Windows98時代に作られたバッチファイル(command.com用バッチファイル)をWindows8上で動かそうとしており、「それは無理ですよ」と説明したところ、WindowsXPやWindows7では動いたのに、とがっかりされた記憶があります。
昨今の状況として、その性質上、あまり高度なことができるわけではないため、案件にて“システム開発言語”としてShell script(シェルスクリプト)が採用されることはまずありません。
しかし、ちょっとしたことに手軽に使えるプログラミング言語として、もっと言うとプログラマーの三大美徳「怠惰(Laziness)、短気(Impatience)、 傲慢(Hubris)」を満たすためのツールとしてよく使われています。
例えば、logファイルなどを特定のファイルをフォルダーに集めてバックアップしたいだとか、パソコンのIPアドレスの設定をクリック一つで決めた値にできるようにしたいだとか、そういった“システムというには大げさだけど、あると便利な仕掛け”を作るのによく使われています。
今回はShell script(シェルスクリプト)についてみていきました。
定常作業などは「Shell script(シェルスクリプト)やバッチファイル一つで、楽になる」ということも多いので、アプリ系(フロントエンド)エンジニアであっても、インフラ系(サーバエンド)エンジニアであってもShell script(シェルスクリプト)ができると、結構、現場で重宝されます。
案件がないので、一最初に覚えるプログラミング言語としてはまったくお勧めしませんが、ある程度扱えるようになっておくと、なにかと役立つプログラミング言語です。
3つの質問に答えるだけで、フリーランスエンジニアとしての単価相場を算出します。 スキルやご経験にマッチする案件もあわせてご紹介いたしますので、気軽にご活用ください! ※単価相場の算出に個人情報の回答は必要ございません。