超重要な「シェル」
これまで開発環境について説明するなかで、C言語とPythonについて取り上げてきた。C言語はカーネルやシステムが提供している機能を直接的に利用するためのものとして、Pythonは学習が比較的容易で実用的に利用できる現在最も人気の高いプログラミング言語の1つとして取り上げた。これらは、比較的両極端に位置するプログラミング言語であり、この2つを網羅しておけばLinuxではかなりの範囲のことができるようになる。
今回からは、これらとは別の切り口で「シェル」について取り上げる。Linuxサーバにリモートログインして実際に作業を行う際に人間がインターフェースとして扱うことになるのがシェルだ。多くのLinuxディストリビューションではbashが使われることが多い。シェルの操作方法をどの程度知っているか、シェルの機能にどの程度精通しているかは、そのままLinux操作の効率に関わってくる。
シェルは、Linuxシステムの起動や管理にも使われている。こちらはシェルで組み上げられたシェルスクリプトだ。シェルスクリプトにも「bash」が使われることが多い。ただし、より軽量に動作するという理由でbashではなく「dash」が使われていることも多い。シェルは管理用のコンソールとしても、操作用のインタラクティブインタフェースとしても使われる、Linuxにおいて中核を成すソフトウェアの1つである。
シェルの歴史と種類
シェルはかなり古くから存在しているソフトウェアだ。Linux設計のベースアイデアになっているUNIX系OSの初期から存在していたソフトウェアで、いくつかの種類が存在している。
それらをざっくり分けると、シェルにはBourne Shell系とC Shell系がある。文法がかなり違うので、まずはこの2つで分類することになる。
- Bourne Shell (sh)
- C Shell (csh)
発祥が古いほうがBourne Shell系ということになるだろう。C Shell系はバークレーで開発されたBourne Shellよりも後発のシェルで、当時のBourne Shell系と異なり文法がC言語っぽく、さらにインタラクティブ機能が追加されていた。その後、それぞれの系列に分類される多機能インタラクティブシェルとしてksh、bash、zsh、tcshなどが登場している。
- Bourne Shell (sh)系 - ksh、bash、zsh
- C Shell (csh) - tcsh
最後発のシェルとしてオリジナルのシンタクスを持ったfishなども登場している。ざっくりまとめると次のようになるだろう。
- Bourne Shell (sh)系 - ksh、bash、zsh
- C Shell (csh) - tcsh
- それ以外 - fish
C Shell系は登場した当初はインタラクティブ機能が強化された便利なシェルだったのだが、今となってはほかの多機能インタラクティブシェルと比較した利点はほとんどないと言える。好みの問題もあるが、インタラクティブの便利さでいえばfishが一番だろう。最後発だけあってよくできている。
では、「管理に利用するためのシェルとしてはどれを学ぶのがよいか」ということになるのだが、ここではBourne Shellに最も近いdash、もしくはashをオススメしておきたい。Linuxではdashの実装が使われることが多く、*BSD系ではashが使われることが多い。オリジナルのBourne Shellの実装系に一番近いのがこの2つだ。dashはashをLinuxに移植したものなので、源流はほぼ同じである。システムのシェルスクリプトはこれで組まれていると考えておくとよいだろう(bashでシステムのシェルスクリプトが組まれているものもある)。
dashやashの使い方に精通しておくと、広い範囲で応用が効く。dashやashで学んだことはそのままpsh、bash、zshなどでも利用できる。シェルスクリプトを組む際にも、基本的にはこの機能を知っていればよい。ワンライナーなどもdashやashの使い方をマスターすれば応用できるので、ここは押さえておきたいところだ。
どうやって学べばよい?
実のところ、「シェルやシェルスクリプトを学ぶ方法」というのが最も難しい。モダンなプログラミング言語には大体代表的なチュートリアルが存在している。開発元のベンダやプロジェクトが公開しているドキュメントで、チュートリアルを頭から通して学んでいけば一通り理解できるようになっている。しかし、シェルにはこれが存在しないのだ。
シェルはUNIX系OSの発展とともに使われてきたソフトウェアだ。マニュアルまでは存在しているものの、代表的なチュートリアルというものが存在していない。また、シェルが提供している機能はカーネルのシステムコールに通じるものが多く、カーネルやシステムコールについて理解がないと、その機能や実際の動きを理解するのが難しいところがある。
シェルやシェルスクリプトを解説した書籍やスニペット的な記事は多いのだが、結構断片的であることも多く、系統立てた学習を行うのが難しいのが現状だ。シェルのソースコードを読んでいけば何をしているのかはわかるかもしれないが、それは本連載の趣旨からするとハードすぎるだろう。
どうしたものか悩むのだが、ここではashのマニュアルページ「sh(1)」をチュートリアルの代わりに読み進めることで、機能の説明を行っていこうと思う。チュートリアルほどわかりやすい構成にはなっていないのだが、シェルの機能をフルで網羅するにはこのドキュメントが理解しやすいはずだ。
C言語やPythonは、場合によっては一生使わないLinuxユーザーもいるだろう。しかし、シェルを使わないユーザーはまずいない。シェルは学べば学ぶほど、Linuxファイルを豊かでそして楽しいものにしてくれる。シェルについてはじっくり学んでいこう。
開発言語としてのシェルスクリプト
シェルは制御構文の機能も有しているため、C言語やPythonのようなプログラミング言語として扱うこともできる。スコープやプロセスの扱いについては、プログラミング言語とはかなり特性が異なるが、その辺りは慣れの問題だ。慣れさえすれば、シェルスクリプトはかなり強力なプログラミング言語であることがわかってくる。
実際にシェルスクリプトで開発されたソフトウェアは多い。プロトタイプ的な位置付けで使われることも多く、まずシェルスクリプトで開発してから、一部をC言語に置き換えていくといった使われ方もされることもあるし、最初から最後までシェルスクリプトで作られることもある。
ただ、本連載の趣旨はLinuxサーバの管理にあるので、シェルをプログラミング言語としてバリバリ使っていくようなことはしない。そういった用途で使うのであれば、Pythonのようなプログラミング言語を覚えたほうが何かとつぶしが利くからだ。ただし、プログラミングが可能であることは知っておいてもらえればと思う。