ERROR(1)

名称
error - コンパイラのエラーメッセージを解析する

書式
error [-n] [-s] [-q] [-v] [-t suffixlist] [-I ignorefile] [name]

解説
error は、エラーメッセージの解析を行ない、 多くのコンパイラや言語処理系で生成されたエラーメッセージを、 ソースファイル上で実際にエラーが発生した場所に配置させます。 このコマンドは、紙の上にエラーを適当に省略してメモするという 骨のおれる古臭い作業に代わるもので、 スクリーンエディタのマルチウィンドウ機能の助けなしで エラーメッセージとソースコードを一緒に眺められるようにします。

本コマンドで使用可能なオプションは以下の通りです:

-n  一切のファイルの書き換え (touch) を しません。 すべてのエラーメッセージは、 標準出力に送られます。

-q  ユーザにファイルの書き換えをするかどうかを尋ねます。質問に対して ``y'' か ``n'' を答えないと処理を継続できません。 -q オプションを指定しない場合には、参照された全てのファイル (捨ててしまったエラーメッセージだけが参照していたものを除く) は書き換えの対象になります。

-v  全てのファイルの書き換えが終った後で、エディタ vi(1) を起動し、書き換えたすべてのファイルの編集を準備します。そして、 書き換えた最初のファイルの最初のエラーのところに位置あわせをします。 vi(1) が見つからない場合には、かわりに ex(1) もしくは ed(1) を通常の場所から起動します。

-t  スイッチに続いて指定された引数をサフィックスリストとして取得します。 サフィックスリストにないサフィックスを持つファイルは、本コマンドに よる書き換えの対象となりません。 サフィクスリストにはサフィクスをドットで区切って並べて下さい。 また、``*'' によるワイルドカード指定も有効です。 例えば、以下に示すようなサフィックスリスト

        .c.y.foo*.h

    は、 error コマンドが ``.c'', ``.y'', ``.foo*'', ``.h'' のいずれかのサフィックス で終了するファイル名のファイルを書き換えることを許可していることを意味します。

-s  エラーのカテゴリ別の統計情報を出力します。 あまり役に立つものではありません。

-I  ~/.errorrc の代わりに使うファイル名を指定します。

error コマンドは、 name で指定したファイルから読み込まれた、もしくは標準入力から送られたエラー メッセージを見て、 それぞれのエラーメッセージを吐き出した言語処理系の判定を試みます。 そして各エラーメッセージが参照しているソースファイルと行番号を決定し、 無視してよいエラーメッセージかどうかを判定した後で、 対応するソースプログラムのファイルの当該エラーが参照している行の直前に (少し変更した)エラーメッセージをコメントの形で挿入します。 言語処理系や内容によるカテゴリ分けが出来ないエラーメッセージは、 いかなるファイルにも挿入されずに、標準出力に送られます。 error は、全ての入力を読み終わった後でしかソースファイルを書き換えません。

error コマンドは、標準入力をパイプを経由して、 エラーメッセージを吐き出すプログラムにつないで使うことを想定しています。 言語処理系の中には、エラーメッセージを標準エラーに出すものもあれば、 標準出力に出すものもあります。 したがって、両方のエラーの出力先を、ともにパイプによって error コマンドに送ったほうがよいでしょう。 例えば、 csh(1) を使用した場合の書式では、

    make -s lint | error -q -v

のようになります。こうすれば、 make(1) を用いてターゲット lint をメイクしたときに、 どんなプログラムが実行されたとしても、全てのエラーを解析する ことができるでしょう。

error は、 make(1), cc(1), cpp(1), ccom(1), as(1), ld(1), lint(1), pi(1), pc(1), f77(1), DEC Western Research Modula-2 の各処理系で生成されたエラーメッセージを解析することが出来ます。 error コマンドは、言語プロセッサによって生成されるエラーメッセージの標準形式を 内部に持っているため、その形式の変更には敏感です。 Pascal を除く全ての処理系では、エラーメッセージは1行に制限されています。 また、エラーメッセージの中には、複数のファイルの複数の行を参照する ものがあります。 error コマンドはエラーメッセージを複製し、そのエラーメッセージの参照する全ての行に 対して情報を付加します。

error コマンドは、 それぞれのエラーメッセージに対して以下の6つの動作のうち1つを行ないます。

同期 (synchronize)
    言語処理系の中には、どのファイルを現在処理しているかについて短い メッセージを生成するものがあります。 error コマンドは、この情報を用いて、それぞれのエラーメッセージに ファイル名を含めないような言語についてのファイル名を判定します。 これらの同期メッセージは、 error コマンドによって使われ、出力されることはありません。

捨てる (discard)
    以下の2つの lint(1) ライブラリ、 /usr/libdata/lint/llib-lc および /usr/libdata/lint/llib-port のうち、どちらか一方を参照する lint(1) からのエラーメッセージは捨てます。 これは、誤ってこれらのライブラリを書き換えることがないようにするためです。 ここでもこれらのエラーメッセージは、 error コマンドによって使われ、出力されることはありません。

無効化 (nullify)
    特定の関数に対する lint(1) からのエラーメッセージのうち、すでに出ることが分かっていて必要のない情報は、 無効化することができます。 無効化されたエラーメッセージは、ソースファイルには挿入されず、 標準出力へ送られます。 無視される関数名は、ユーザのホームディレクトリ配下の .errorrc ファイルもしくは -I オプションによって名前を指定したファイルのどちらかによって与えます。 このファイルが存在しない場合には、どのエラーメッセージも無効化されません。 ファイルが存在する場合には、関数名は1行に1つずつ記述しなければなりません。

ファイルと関連しない (not file specific)
    読み方がわからないエラーメッセージはひとまとめにされ、 ファイルを書き換える 前に標準出力に送られます。 これらのエラーメッセージは、どのソースファイルにも挿入されません。

ファイルと関連 (file specific)
    特定のファイルを参照するが、 特定の行を参照しないエラーメッセージについては、 そのファイルの書き換えを行なう時に標準出力に送られます。

確かなエラー (true errors)
    その他の、読み方がわかるエラーメッセージは、 そのエラーメッセージの参照するファイル への挿入の候補となります。

確かなエラーメッセージのみファイル挿入の候補とされます。 他のエラーメッセージは、全て error コマンドによって処理されるか、あるいは標準出力 に対して送られます。 error コマンドは、エラーメッセージをソースファイル上のエラー 行の直前の行に挿入します。 各エラーメッセージは、各言語の 1 行のコメントの形に変形されます。 そして、エラーの先頭に文字列 ``###'' を、エラーの最後尾に 文字列 ``%%%'' を付加して、内部的な印をつけます。 これにより、エディタを用いたエラーのパターン検索が簡単になり、 挿入されたメッセージを取り除くのも簡単になります。 加えて、各エラーメッセージは、 そのエラーメッセージが参照する行のソース上の行番号を含んでいます。 きちんとした形式に整えられたソースプログラムは、 挿入されたメッセージを削除しなくとも、 それらのエラーメッセージが深刻なエラーを起こすことなく再コンパイルが可能です。 しかし、C や Pascal のように自由形式で記述が可能な言語で、 なおかつソースプログラムの形式がきちんと整っていない場合には、 コメントの中にコメントが入ってしまうことが考えられます。 すると、後のコンパイル時に何らかの不具合が生じることが十分考えられます。 このことを回避するためには、 複数の行からなるコメントとプログラムの実体が同じ行にあるようなプログラムでは、 コメントの前にプログラム言語の文が現れるようにしてください。

error コマンドは、インタラプトシグナルおよびターミネートシグナルを受け取ります。 シグナルを受けたのがコメントを挿入する段階だった場合には、 実行中の操作を整然と終了します。

関連ファイル
~/.errorrc
    lint(1) のエラーメッセージを無視する関数名
/dev/tty
    ユーザの端末

歴史
error コマンドは、 4.0BSD にて初めて実装されました。

作者
Robert Henry

バグ

ユーザに問い合わせを行なうために、端末ファイルを直接オープンします。

ハードリンクされたソースファイルについては、 他とリンクされない新しい複製を作ります。 他のリンクファイルにはその結果が反映されません。

言語処理系のエラーメッセージの形式が変更された場合、 error コマンドにはそのエラーメッセージが理解できなくなるかもしれません。

error コマンドは 全く機械的に処理を行うため、 1つのつまらない文法上のエラーが原因で引き起こされる `水門の決壊 (floodgating)' により派生した後続のエラーをふるい落としません。 この種のエラーを無視することは、人間の方がずっと得意です。

Pascal のエラーメッセージは、本来はエラー行の後ろに来るべきです。 ( error コマンドは、エラー行の前にエラーメッセージを置きますが。) また、エラーのある位置を示す `\' の配置が error コマンドによって乱れてしまいます。

error コマンドは、適度に高速に表示される CRT を見つつ仕事を行うのに適したように設計されています。 遅い速度の端末を見ながら作業するのにはいささか不都合です。 まして、ハードコピー端末で使った人はいません。