シェル - それはプログラミング言語なのか
一般的にシェルと呼ばれるのは、ユーザとのコマンドのやりとりを行うコマンド・プロセッサとも呼ばれるプログラムです。
大型機の時代であればJCL(JobControlLanguage)が使われていましたし、Windowsの前身であるMS-DOSであればCOMMAND.COMがそれにあたります。シェルという呼び方の元になったのがUNIXで使われていたshコマンドです。
CUIの時代には、コンピュータでプログラムを走らせる時に、キーボードからコマンド名などを打ち込むことで、やりたいことをコンピュータに指示します。これを解釈してプログラムを読み込んで実行し、場合によればプログラムで必要な設定なども、そこで指示するわけです。こういう処理を行うのがシェルなわけです。
シェルは基本的には、キーボードから打ち込むような文字列を書き連ねるわけですが、単にコマンドだけではなくifであるとかforなどの制御構文、変数や関数定義などあり、外部のプログラムを呼び出すだけでなくシェル自身が解釈して実行する内部コマンドも持っています。これだけの事ができれば、シェルは単なるキーボード入力の代替ではなく、立派なプログラミング言語といえるでしょう。
UNIXで標準的に使われているシェルはBourne Shellと呼ばれているshコマンドで、細かな方言があったものの今ではPOSIXという規格に準拠したものになっています。
Bourne Shell
Bourne Shellはスクリプトとして使うには十分な機能を持っているのですが、対話的に使うには少し不便なところがあり、その後C Shellが作られ、こちらも良く使われるようになりました。
C Shell
C Shellは、構文がC言語っぽいですし、ヒストリやエリアスなども便利で、私はUNIXを覚えた頃はもっぱら、これでスクリプトを書いていました。多くのプログラマがどっちを使うのかは悩んだようで、その後、間をとったKornShellも作られましたが、今はBashが主流です。
KornShell
Bash
そうそうC Shell派の人はtcshを使う人もまだまだ居ますね。
tcsh
シェルで書いたコードはシェルスクリプトと呼ばれており、インタプリタとして実行されるので中身は単なるテキストです。時折、shであるとかcshといった拡張子をつけた使い方も見かけますが、普通はコマンドと同じように拡張子をつけません。いろいろなシェルが存在するので、どのシェルのスクリプトであるかを見分けるために最初の行に
のように実行するシェルのコマンドパスを記述して区別をします。
シェルスクリプト
まだシェル自身の設定を行うために.profile .bashrc, .bash_profileなどの隠しファイルが使えるようになっていて(これらはbashの場合、シェルの種類によってファイル名は異なることが普通)、あなた好みのCUI環境をカスタマイズできるようになっています。
シェルの初期設定
シェルを使う時に特徴的なのは基本的に型を持たず、すべて文字列で処理をするので、正規表現によるパターンマッチがよく使われます。例えば”*”という特別な意味を持つ文字を指定すると、この場合はカレントディレクトリにある全てのファイル(例外あり)とマッチするので、これを展開(”*”という文字をファイル名の並びの文字列にする)して、コマンドなりに引き数として渡すのです。この機能をシェルで行うためにコマンド側では個別に処理を行わなくても済むようになっていますし、どのコマンドでも同じ正規表現を使って呼び出すことができるという仕組みです。
ちょっとややこしいのがシェル変数と環境変数の関係なんですが、このあたりからいろいろ面倒な話が増えてくるので割愛です。
シェルはWindowsのコマンドを処理するCOMMAND.COMやCMD.EXEなどにも影響を与えていますし、CUIと仲良くするにはシェルのいろいろな機能を覚えると格段に使いやすくなります。例えば特定のコマンドに対して、ちょっとだけカスタムしたいときなどには、コマンド名と同じ名前のスクリプトを用意して、そこにカスタムする内容を書いた上で、元のコマンドより優先順位の高いPATHに置いておけば、いつものコマンドを打てばスクリプトの方が動くなんていう技もあります。
またインストーラとしてもよく使われますし、意識をしていなくても無くてはならない言語のひとつになっています。でもわざわざ「私はシェルが出来ます」とは言いませんけどね。でもスクリプトでいろいろな処理が手軽に自動化出来ることこそCUIの魅力のひとつではあると思います。今は大抵のことはあまりパフォーマンスにこだわらなくても大丈夫なだけのマシンパワーがあるので、わざわざ小難しいプログラミング言語を習得しなくてもシェルさえ使いこなせれば間に合うことも多いです。
ヘッダ画像は、以下のものを加工して作りました。https://www.irasutoya.com/2013/03/blog-post_2173.html