UNIX環境ではさまざまなコマンドラインツールを駆使して作業を行います。
コマンドラインツールはUNIXの誕生とともに存在することから、何の変化もなく使われ続けているように思えますが、実は時代とともに構文が大きく変わってきているようです。
UNIXコマンドラインの規約の変遷を知ることができる文書「Unix command line conventions over time」が、、ソフトウェア開発者Lars Wirzenius氏によって作成されています。
徐々に多機能化が進む
同文書によると、UNIXの黎明期である1970年代前半に、UNIXのコマンドライン規約の基礎が形作られました。
初期のプログラムは、コマンドラインの引数としてファイル名が与えられればそれを、ファイル名が与えられなければ標準入力を読み込み、出力を標準出力に書き出します。オプションは存在しないか、少数の固定的なものしか存在しなかったそうです。
$cat *.txt|wc
例えば上の例は、*.txtファイルを全て読み込こんで標準出力に書き込み、wcはパイプ経由で標準入力を読み込み、単語数を数え、標準出力に書き出します。
この後、ダッシュ1つと1つの文字で構成されるシンプルなコマンドラインオプションが追加され、オプションに値が指定できるように拡張されます。
$ sort -k1 $ sort -k 1
上の例はsortコマンドの「-k」オプションに値「1を渡しています。
1980年にCライブラリ関数getoptが書かれ、コマンドライン解析処理の共通化が図られます。また長いオプションが導入され、X window systemで使用される「-display」のようなオプションが使用されるようになります。
複雑化するオプション解析に多大な貢献を果たしたのがGNUプロジェクトで、オプション値の指定に等号(=)を使う機能が導入されます。GNUプロジェクトが作成したgetopt_long関数によって、複雑なコマンドラインの解析処理を、さまざまなツールから呼び出す事が可能となります。
$grep-xi*.txt--regexp=foo --regexp bar
上の例では短いオプションである「-x」と「-i」、さらに長いオプションの「--regexp」の等号があるものとないものが同時に指定されています。GNUはまた標準オプションとして、「--help」「--version」などを追加しています。
1980年の終わり頃には、コマンドライン構文規約にサブコマンドが追加されます。1990年から使用されていたバージョン管理ツールCVSは最初からサブコマンドを装備しており、チェックイン時に使用する「ci」や、チェックアウト時に使用する「co」などのサブコマンドを搭載していました。
$ cvs ci ... $ cvs co ...
Subversion、Arch、Gitなどのバージョン管理システムは、このサブコマンドパターンを踏襲しています。
まとめ
一見変化がなさそうに思えるコマンドラインツールですが、長い時間をかけ、ゆっくりと進化してきたことがわかります。複雑なオプションの指定方法も、その規約が生まれた背景を考えると理解しやすいかもしれません。