###
2 オプションとは何か

オプションはプログラムの実行を調整したり、カスタマイズしたりするための補助的な 情報を与えるために使います。もっとはっきりいうと、オプションはあくまでもオプション (省略可能)であるということです。本来、プログラムはともかくもオプションなしでうまく 実行できてしかるべきです。(Unix やGNU ツールセットのプログラムをランダムに ピックアップしてみてください。オプションを全く指定しなくてもちゃんと動くでしょう？ 例外は`find`, `tar`, `dd` くらいです--これらの例外は、 オプション文法が標準的でなく、インタフェースが混乱を招くと酷評されてきた変種の はみ出しものなのです)

多くの人が自分のプログラムに「必須のオプション」を持たせたいと考えます。しかし よく考えてください。必須なら、それはオプション(省略可能) ではないのです！ プログラムを正しく動作させるのに絶対的に必要な情報があるとすれば、そこには 固定引数を割り当てるべきなのです。

良くできたコマンドラインインタフェース設計として、ファイルのコピーに使われる `cp` ユーティリティのことを考えてみましょう。ファイルのコピーでは、 コピー先を指定せずにファイルをコピーするのは無意味な操作ですし、少なくとも一つの コピー元が必要です。従って、`cp` は引数無しで実行すると失敗します。 とはいえ、`cp` はオプションを全く必要としない柔軟で便利なコマンドライン 文法を備えています:

    cp SOURCE DEST
    cp SOURCE ... DEST-DIR

まだあります。ほとんどの `cp` の実装では、ファイルモードや変更時刻を変えずに コピーする、シンボリックリンクの追跡を行わない、すでにあるファイルを上書きする前に ユーザに尋ねる、など、ファイルをコピーする方法をいじるための一連のオプションを実装 しています。しかし、こうしたオプションは、一つのファイルを別の場所にコピーする、 または複数のファイルを別のディレクトリにコピーするという、`cp` の中心的な処理 を乱すことはないのです。