シェルスクリプトはどのシェルで書くとよいのか

昨日紹介した通り、「新しいシェルプログラミングの教科書」という本を執筆しました。

新しいシェルプログラミングの教科書

新しいシェルプログラミングの教科書

名前のとおり、シェルスクリプトの書き方を解説した本です。 その本を書き始めるのにあたって、どのシェルでシェルスクリプトを書くのかを決める必要がありました。 シェルの種類はいくつもありますが、その中でも有力な候補がBourne Shellbashです。 Bourne Shell/bin/shとしてインストールされている、伝統的なシェルです。 bashはたいていのLinuxで標準のシェルとして設定されていて、よく使われているシェルです。

どちらもシェルスクリプトを実装するシェルとしてよく使われます。 両方を解説するという手もありましたが、執筆の負担が高くなりすぎたり解説が煩雑になって読みにくくなる恐れがあったので、どちらか一つに絞ることにしました。 いろいろ検討した結果、今回の本ではbashを採用しました。

Bourne Shellは仕様がPOSIXに含まれていて、移植性が高いシェルです。 Bourne Shellシェルスクリプトを書けば、さまざまな環境で安定して動作することが期待できます。 一方、bashはインストールされていない環境もあります。 bashシェルスクリプトを作成したとして、環境を移行したらbashがないので動かなかった、という可能性があります。

それでは実際にUnix系OSを使うときに、bashはないがBourne Shellならあるという状況がどのくらいあるのでしょうか。 個人的には、私は今までそういう場面に出くわしたことは一度もありません。 他の人も多くはそうだろうと思います。 むしろ、/bin/shの実体がbashである環境もあります。 たとえば、CentOSでは/bin/shbashシンボリックリンクになっています。 それはつまり、Bourne Shellはないがbashならあるということになります。 つまり、bashを使う(使える)頻度は非常に高いのです。

そして、bashにはBourne Shellと比べて便利な機能が追加されています。 そんな便利な機能を使ってみたいと思いませんか。 私は思います。 その割には、bashの機能をきちんと解説した本は少ないように思っています。 それがこの本を書いた動機の一つです。

それでもBourne Shellのほうが望ましいと考える人もいるでしょう。 その考えも分かります。 Bourne Shellbash、またはそれ以外のシェル、どれがふさわしいのかは一概に言えるものではありません。 実行環境、製作者のスキル、利用する期間などを考慮して、みなさんが自分自身で決めることです。 そして、結果としてBourne Shell(またはその他bash以外のシェル)を選択した方は、この本の対象とする読者ではありません。 別の本を読んで勉強してください。

これは何もシェルスクリプトに限ったことではありません。 何らかのツールやアプリケーションを開発したいと思ったとき、実装する手段としてC、JavaRubyBourne Shellbashなどさまざまな選択肢があります。 この「新しいシェルプログラミングの教科書」はbashの本なので、bashの便利な使い方について解説しています。 しかし、この本は他の選択肢を否定したり排除したりしているわけではありません。 bashも、それ以外のシェルも、その他の一般的なプログラム言語も、どれにも役割があります。 どれか一つだけでは対応できないこともあります。 さまざまなシェル、さまざまな言語を学ぶことが大切です。 そして、その中でも特にbashを学びたいと思ったときは、この「新しいシェルプログラミングの教科書」をぜひ活用してください。