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

    では、 ``.c'', ``.y'', ``.foo*'', ``.h'' で終わる名前のファイルが書換えの 対象になります。

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

error コマンドは、 name で指定されたファイルから、あるいは標準入力から読込まれたエラーメッセージを 見て、各エラーメッセージを出力した言語処理系の判定を試みます。 そして、各エラーメッセージが指しているソースファイルと行番号を特定し、 そのエラーメッセージが無視しても構わないものかどうかを判定します。 無視できないエラーであれば、そのエラーを起こしているソースファイルの、該当する 行の直前に、コメントの形でエラーメッセージ (少し変更されます) を挿入します。 言語処理系や内容による分類ができないエラーメッセージは、いかなるファイルにも 挿入されず、その代りに標準出力へ送られます。 error コマンドは、入力を全て読み終えてから、ソースファイルの書換えを始めます。

error コマンドは、処理系からの出力を、パイプで標準入力へ送るような使い方を 想定しています。 言語処理系の中には、エラーメッセージを標準エラー出力へ出すものもあれば、 標準出力へ出すものもあります。 従って、両方の出力をパイプで error コマンドに送ってしまう方がよいでしょう。 例えば、 csh(1) の書式で書いた以下の例では、

    make -s lint | error -q -v

lint を作る際に make(1) が実行したプログラムが出力した全エラーメッセージを解析できます。

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 コマンドは、各エラーメッセージに対し、次の 6 つの動作のうちの 1 つを行います。

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

破棄 (discard)
    lint(1) からのエラーメッセージで、 lint(1) ライブラリの /usr/libdata/lint/llib-lc あるいは /usr/libdata/lint/llib-port のどちらかを参照しているものは破棄されます。 これは、誤ってこれらのライブラリを書換えることがないようにするためです。 ここでも、これらのエラーメッセージは捨てられ、 どこにも出力されません。

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

ファイル特定不可 (not file specific)
    ファイルを特定できないエラーメッセージはひとまとめにされ、 ファイルの変更を開始する前に標準出力へ書き出されます。 このようなエラーメッセージは、いなかるソースファイルにも挿入されません。

特定のファイル (file specific)
    特定のファイルを参照してはいるが、その中の行までは特定していない エラーメッセージは、そのファイルを変更する時に、標準出力に書き出されます。

厳密なエラー (true errors)
    参照位置が特定できるエラーメッセージは、そのファイルへ挿入されることに なります。

厳密なエラーメッセージだけが、それが参照しているファイルへ挿入されることに なります。 それ以外のエラーメッセージは、 error によって捨てられるか、あるいは標準出力へ送られます。 error コマンドは、エラーメッセージを、エラー発生行の直前に挿入します。 各エラーメッセージは、その言語における、1 行のコメントに変形され、 更にその内部の先頭に ``###''を、末尾に ``%%%'' を付け加えます。 これにより、エディタ内でエラーメッセージを検索する際に パターン検索で簡単に探せるようになり、メッセージの削除も簡単になります。 加えて、各エラーメッセージには、そのメッセージが参照している行の行番号が 含まれています。 きちんと整形されたソースプログラムであれば、挿入されたエラーメッセージを 削除しなくても、それらが新たなエラーを引き起こすことなく再コンパイルが 可能です。ですが、C や Pascal などのようなフリーフォーマットの言語では、 きちんと整形されていないソースの場合、コメントの中にコメントが入ってしまう ことが考えられます。こうなると、その後のコンパイルにおいて、不具合を生じる ことになります。このような問題を回避するため、プログラムコードと 複数のコメントとが同じ行にあるような部分は、コードをコメントの前に もってくるように整形してください。

error は、インタラプト (INT) シグナル、およびターミネート (TERM) シグナルを 捕まえ、捕まえると実行中の作業を行儀よく終了します。 たとえそれが挿入フェーズであってもです。

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

歴史
error コマンドは 4.0BSD から登場しました。

作者
Robert Henry

バグ

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

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

言語処理系のエラーメッセージのフォーマットが変更された場合、 error コマンドはそのエラーメッセージを解釈できなくなってしまうかもしれません。

error コマンドは、全く機械的に処理を行うため、1 つの些細な文法エラーから 引き起こされる、一連の `なだれ的な' エラーを、正直に全部挿入して しまいます。 このような一連のエラーを無視するのは、人間の方がずっと得意です。

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

error コマンドは、それなりに高速な表示の行える CRT 上で、作業することを前提にして作られています。 低速な端末での利用はあまり好ましくありません。 ですから、ハードコピー端末で利用されたことはありません。