シェルスクリプトマガジン

特集 無いものは作れTukubai 流コマンド自作文化(前半・本誌vol.7掲載)

各地でOpen usp Tukubai を紹介すると、多くの人にとても興味を引かれることがある。

それは、Unix コマンドを自ら作っていくと言う習慣だ。
コマンドを作るということは、他言語で考えればifやfor等の予約語を追加するようなものかもしれない。そう考えると確かに興味深い。
だが、Unix の世界ではそれが当初のやり方だった。
コマンドを自作する文化。
この素晴らしさを、改めて伝えたい。

written by USPマガジン編集部

本記事は、USP MAGAZINE vol.7(2013年冬号)掲載記事のWEB再録記事(前半部分)です。

後半部分はこちら

本記事掲載のUSP MAGAZINE vol.7は以下リンク先でご購入できます。

第一章 共通部品でない、道具を作るということ

Open usp Tukubai は、何のために生まれたか

2012 年の今年、USP 研究所はOpen usp Tukubai と名付けたUnix シェル向け追加コマンドセット(通称Tukubai コマンド)をリリースした。

名称の一部となっている“Tukubai” は、このコマンドセットに付けた単なる名前ではない。オープンソースやオープンプラットフォームの「ソース」や「プラットフォーム」などと同様に、ある一つの概念を指し示す用語なのだ。この「ある一つの概念」を端的に言い表す用語というものが存在しなかったため、USP 研究所がコマンドセットのリリースに合わせて新たに定義したものなのである。
本誌もこれまでこの語を度々用いてきたが、ここで改めてTukubai の意味を記すことにする。

Tukubai とは

Unix 哲学や“Software Tools”(B.W.Kernighan、P.J.Plauger著)等の作法を忠実に受け継ぎ、進化させたシステム構築法。同音である蹲(蹲踞とも記す)という道具が用いられる茶道の精神に通じるものがあることからこの名を付けた。

“Software Tools” の邦訳版「ソフトウェア作法」(共立出版)。30 年以上発行され続けている名書である。

 

つまりTukubai は一種の思想であり、その源流は、Unix を生み出した先人たちの哲学にある。そしてこの哲学を受け継ぎ、進化させ、USP 研究所なりに具現化したものがOpen usp Tukubai なのだ。将来Tukubai という語が一般化し、Tukubai の思想に基づいてある人Xがコマンドセットをリリースするなら、それはOpen XTukubai と呼ぶべき存在になるかもしれない。
従ってTukubai コマンドは、実はその表面的な姿(書式や仕様、種類)が重要なのではない。重要なのは、コマンドセット全体としてどんな役割を果たしているかである。そしてTukubai コマンドが果たすべき役割とは、ソフトウェア開発における「道具」になることである。

「道具とは何か」を理解する

Tukubai が指し示す「道具」は、共通部品とは明確に区別される。では、共通部品ではない道具とは何なのか。まず道具が持ち合わせるべき三つの性質を記す。

一、 単機能であって汎用性がある。
二、 インターフェースが決まっているが、逆にそれさえ守っていれば他には一切の制約がない。
三、 同じものを発明する気を起こさせない。

更に付け加えるなら、「作ってみればあって当たり前の存在」、「何処の誰もが使えるもの」などとも言いたいところだ。
これらの性質を満たしているものは、世の中の様々な分野において、作業を効率的に熟こなすうえで必要不可欠なものに成り得る。勿論、ソフトウェアの世界においても例外ではない。
身近にある道具と呼ばれるものを色々思い浮かべてもらいたい。それらがこの三つの性質を満たしているかどうか考えてみれば、ここで言わんとしている道具がどういうものであるかが見えてくるだろう。

身の回りにある例

例えば西洋料理を食す際に使うナイフやフォーク、スプーンの類。これは道具であろう。西洋料理を食す時は誰もが使うし、同種のものを発明する気も起らない。インターフェースについて考えてみても、どれも片手で持って使うようにできているし、皆棒状の形で大きさや重さ等も概ね揃えられている。もし違っていたら、揃えるべく、きっと誰かが同じ類のものを発明しているに違いない。
一方で共通部品的な物とは、複数の道具をくっつけてみたり、よくある道具の形をちょっとだけ変形してみたり、といった俗に言うアイデア商品の大部分のものではないだろうか。
それらは特定の作業には驚く程の利便性を発揮するが、汎用性が乏しいために歴史の一部となるほどには普及しない。そして似たようなものが再発明されたりもする。

ソフトウェアにおける例

そして、ソフトウェアにも道具的なものと共通部品的なものがある。ある程度汎用性があり、再利用可能なコードを集めたものとされるライブラリーは、その両方を持ち得る。例えば、Microsoft Visual C++ には通称MFC と呼ばれるクラスライブラリーがある。これはC++ によるWindows プログラミングを容易にするためのものであり、数百個ものクラスが用意されている。しかしそれらを全てを把握して使いこなしている人は恐らく少数だろう。その一方で、C 言語の文字列変数の扱いづらさを補完するCString のように、MFCを利用する人の大多数が利用するクラスもある。このような違いというのも、先に記した三つの性質の有無によるところが大きい。

ユーティリティー、アプリケーション

類似の用語に、ユーティリティー、アプリケーションといったものがあるが、これらもここで言う道具とは違う。ユーティリティーは例えば、バックアップソフトとかテキストエディターといった物を指すが、単機能とは限らないし、インターフェースも様々だし、同様のものが様々作られる。アプリケーションはさらに複合的な機能を有する物を指し、それ単体の使用で大きな目的を達成できる。これらも勿論有用なものだが、単体では目的を達成できない代わりに組み合わせ次第で如何なる目的にも対応できる道具とは方向性の違うものだ。
道具とは何か、ご理解いただけただろうか。これが道具であるかどうかという上記の例は、明確な基準に基づいたものではないため、あまり心地良いものではないかもしれない。
しかし確実に言えることは、三つの性質を満たしていると思える人が多くいるかどうかだ。多くの人が支持するからこそ物は道具になれる。逆に、それは見る立場によって判断が分かれ得るものであるから、特定の地域や時代、或いは特定の分野でのみ道具として認知されるものもある。

Unix における道具とは

既に述べたとおり、Tukubai コマンドは道具としての役割を果たすべく作られたものである。しかしそれ以前に、Unixシェルに用意されている標準コマンドには、先に記した三つの性質を満たす道具的なものが数多くある。
例えばテキストフィルターに分類されるAWK, grep, sed,tr などは道具的であると言えるだろう。一方で、パスワードを設定するpasswd コマンドやテキストエディターである
vi*1 といったコマンドは誰もが使うところであるが、使い方が既に決められていて汎用性は無く、インターフェースが決まっているかという性質に照らし合わせてみても当てはまり難い。これらはむしろユーティリティーと呼ぶべきものであろう。

*1 vi は好みが別れそうだが、何らかのテキストエディターは使うだろう。

このようにUnix のコマンドにおいても、道具的なものとユーティリティー・アプリケーション的なものがある。そして、道具的と呼ぶべきUnix コマンドは、どれも共通した下記の作法を概ね守っている。

◆データのやりとりに標準入出力を使う
◆入出力データをテキストデータとする

道具は、組み合わせて使うことで真価が発揮される。従って、組み合わせて使えるようにすべく、このような作法が生まれたのではないだろうか。Unix において偉大な発明の一つであるパイプ(パイプライン)も、そのような背景から生まれたに違いない。
そしてUnix シェルやシェルスクリプトも上記の作法を守るうえで実に適した仕様になっている。道具たるコマンドを予約語のような感覚で呼び出せ、組み合わせられる。時には“if [” などのように、予約語とコマンドが密接に結び付くこともある。
こういった仕様は、Unix 発明者達の思想の表れであって、「道具をもってして問題を解決するのがUnix シェル」ということを言わんとしているのではないだろうか。

道具に類する用語の整理。ユーティリティー、アプリケーションと呼ばれるものになるに従って、汎用的な用途から専門的な用途へと変化する。ライブラリーは部品であるが、汎用的なものもあれば専門的なものもある。