EN JA
DIFF.INFO(1)
DIFF.INFO(1) FreeBSD General Commands Manual DIFF.INFO(1)

名称

diff.info - diff.info

ファイルの比較とマージ

このマニュアルは GNU Diffutils (バージョン 2.8.7, 2004 年 4 月 12 日) とファイルの違いを示すための GNU diff, diff3, sdiffcmp コマンドとファイルを更新するために、それらの出力を使用する GNU patch の文書です。

Copyright (C) 1992, 1993, 1994, 1998, 2001, 2002, 2004 Free Software Foundation, Inc.

Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation; with no Invariant Sections, with the Front-Cover texts being "A GNU Manual," and with the Back-Cover Texts as in (a) below. A copy of the license is included in the section entitled "GNU Free Documentation License."

(a) The FSF's Back-Cover Text is: "You have freedom to copy and modify this GNU Manual, like GNU software. Copies published by the Free Software Foundation raise funds for GNU development."

 

概要

コンピュータユーザは、2 つのファイルの差がどれくらいあるのか尋ねる機会が多いことを感じます。おそらく 1 つのファイルは、もう 1 つのファイルのより新しいバージョンでしょう。もしかすると、2 つのファイルは最初は同一のものだったのですが、別々の人が変更したものかもしれません。

2 つのファイルや、2 つのディレクトリでそれぞれ対応するファイルの差を表示するために、 diff コマンドを使用することが可能です。 diff は、行単位でのファイル間の差を、コマンドラインで選択可能ないくつかの書式で出力します。この差の組は "diff" (差分) または "patch" (パッチ) と呼ばれることもよくあります。同一ファイルに対して、通常 diff は何も出力しません。バイナリ (テキストでない) ファイルに対して、通常 diff はそれらが異なっていることだけを報告します。

2 つのファイルの差がある場所のオフセットと行番号を表示するために、 cmp コマンドを使用することが可能です。 cmp では、2 つのファイル間で異なっている全ての文字を並べて表示することも可能です。 2 つのファイルを文字単位で比較するもう一つの方法箸靴討蓮Emacs コマンドの ` M-x compare-windows' があります。 *注 Other Window: そのコマンドの詳細については、(emacs) Other Window。

3 つのファイル間の差を表示するために diff3 コマンドを使用することができます。 2 人の人が共通のオリジナルに個別の変更を行なったとき、 diff3 でオリジナルと 2 つの変更されたバージョンの差を報告させることが可能で、衝突しているという警告を用いながら、両者の変更をそれぞれ含めているマージされたファイルを生成することができます。

2 つのファイルを対話的にマージするために sdiff コマンドを使用することができます。

(プログラムのソースコードのような) テキストファイルへの更新を他の人に配布するために、 diff で生成された差分の組を使用することができます。比較したファイルの差が小さいとき、この手法は特に役に立ちます。 diff 出力を与えることで、更新するための patch プログラムを使用したり、ファイルのコピーを "patch"にしたりすることが可能です。 diff とは差分を生成するために 1 つのファイルからもう 1 つのファイルを引くことだと考える場合、 patch とは、もう一つのものを再生成するために差分を 1 つのファイルに加えることだと考えることができます。

このマニュアルの最初では差分の作成に集中し、その後でファイルを更新するために差分を使用する方法を提示します。

GNU diff は、Paul Eggert、Mike Haertel、David Hayes、 Richard Stallman と Len Tower によって書かれました。 Wayne Davison は、一体化した出力書式を設計し実装しました。基本的なアルゴリズムは、 "An O(ND) Difference Algorithm and its Variations", ` Algorithmica' Vol. 1 No. 2, 1986, pp. 251-266 と "A File Comparison Program", Webb Miller and Eugene W. Myers, ` Software--Practice and Experience' Vol. 15 No. 11, 1985, pp. 1025-1040 に記述されています。アルゴリズムは、"Algorithms for Approximate String Matching", E. Ukkonen, ` Information and Control' Vol. 64, 1985, pp. 100-118 に記述されているものに依存しないようにして発明されました。 --minimal オプションが使用されていないなら、 diff は、多くの差分で大きい入力のための準最適の出力を生成する代償でコストを O(N^1.5 log N) に制限する Paul Eggert による発見的な手法を使用します。関連アルゴリズムは、 "Algorithms for Finding Patterns in Strings", ` Handbook of Theoretical Computer Science' (Jan Van Leeuwen, ed.), Vol. A, ` Algorithms and Complexity', Elsevier/MIT Press, 1990, pp. 255-300 のセクション 6.3 で Alfred V. Aho によって調査されています。

GNU diff3 は、Randy Smith によって書かれました。 GNU sdiff は、Thomas Lord によって書かれました。 GNU cmp は、Torbjorn Granlund と David MacKenzie によって書かれました。

GNU patch は、Larry Wall と Paul Eggert によって書かれました。いくつかの GNU の拡張部分は Wayne Davison と David MacKenzie が寄贈してくれました。このマニュアルの一部は、Larry Wall によって書かれたマニュアルページを適用していて、それには彼の許可が付随しています。

 

1 比較が意味するもの

2 つのファイル間の差を考えるときいくつかの方法があります。差を考えるときの一つの方法は、別のファイルを生成するために、まとまった行があるファイルから削除、挿入、または変更されているということです。 diff は、行単位で 2 つのファイルを比較し、異なっている行のまとまりを探し、そして、異なっているそれぞれのまとまりを報告します。目的によって、いくつかの書式で異なっている行を報告させることができます。

GNU diff では、詳細な差異を用いずにファイルが異なっているかどうかを表示することができます。それは、重要ではない差異の表示を抑制する方法も提供しています。最も一般的なこととして、そのような差は単語や行の間の空白の数が変更されているものです。 diff は、アルファベットの大文字小文字の差や、提供されている正規表現にマッチする行の差の表示を抑制する方法も提供しています。これらのオプションは累積されます。例えば、空白とアルファベットの大文字小文字の変更を無視することができます。

2 つのファイルの差を考えるもう 1 つの方法として、バイトの集合が同一または異なっているというのもがあります。 cmp は 2 つのファイル間の差を、行単位ではなく、バイト単位で報告します。結果として、バイナリファイルに対して diff を使用するより、遥かに役に立つことが多いでしょう。テキストファイルに対しては、 cmp は、2 つのファイルが同一かどうか、または、1 つのファイルがもう一方のファイルに前置されているかどうかを知りたいだけのとき、主に役に立ちます。

バイト単位での変更を考慮する影響を説明するには、行単位での変更を考慮することと比較することができ、例えば単一の改行文字がファイルの最初にある場合に何が生じるかを考えてみてください。そのファイルを、最初に改行が無いだけの同一の別ファイルと比較する場合、 diff では改行がファイルに追加されたことを報告しますが、 cmp では 2 つのファイルはほとんど全体が異なっていると報告します。

diff3 は、通常 3 つの入力ファイルを行単位で比較し、差異のある行のまとまりを見つけ、それぞれの差異のある行のまとまりを報告します。その出力は、同じファイルを変更した 2 つのものの差を調べることを容易にするように設計されています。

1.1 Hunk

2 つのファイルを比較しているとき、 diff は、"hunk"と呼ばれる異なっている行のまとまりが疎らに存在している両方のファイルから、共通な行の並びを探します。 2 つの同一ファイルの比較では差異のある行は無いので、1 つの共通な行の並びが見つかり、hunk はありません。 2 つの全く異なるファイルの比較では、共通の行は無く、両方のファイルのすべての行を含んでいる 1 つの大きな hunk が生成されます。一般的に、2 つの与えられたファイル間で、行のマッチを調べる方法はたくさんあります。 diff は、大きな共通行の並びを探しながら差異のある行を小さな hunk にして、全体の hunk の大きさを最小にするよう試みます。

例えば、ファイル ` F' は三行 ` a', ` b', ` c' を含んでいて、ファイル ` G' は同じ行を逆の順序 ` c', ` b', ` a' で含んでいると仮定します。 diff が行 ` c' を共通として見つけた場合、コマンド ` diff F G' は以下の出力を生成します。


1,2d0
< a
< b
3a2,3
> b
> a

しかし、 diff がその代わりに共通行 ` b' に注目するなら、次の出力を生成します:


1c1
< a
---
> c
3c3
< c
---
> a

` a' が共通行として見つかる可能性もあります。 diff は常に、ファイル間の最適なマッチしている部分を見つけるわけではありません。それで実行がより早くなります。しかし、出力は通常可能な限り短くなるようにします。 -d または --minimal オプションで、このトレードオフを調整することができます ("diff Performance"参照)。

1.2 空白とタブの空白の差を抑制する

-E または --ignore-tab-expansion オプションは、入力のタブと空白の違いを無視します。タブは、次のタブストップまでの空白の数に等しいと考えられます ("Tabs"参照)。

-b または --ignore-space-change オプションはより強力です。それらは行末の空白を無視し、それ以外の 1 つ以上の空白の並びが同等であると見なします。これらのオプションを用いると、 diff は、次の 2 つの行が同等であると見なします、ここで、` $' は行末を示します。


Here lyeth muche rychnesse in lytell space. -- John Heywood$
Here lyeth muche rychnesse in lytell space. -- John Heywood $

-w または --ignore-all-space オプションは更に強力です。それらは、片方の行には空白がありもう一方にはない場合でさえ、その差を無視します。 "空白類"文字とは、タブ、改行、垂直タブ、改ページ、キャリッジリターン、と空白です。ロケールによっては、追加の文字が空白類として定義できます。これらのオプションを用いると、 diff は次の 2 つ行を同等と見なします、ここで、` $' は行末を示し、` ^M' はキャリッジリターンを示します。


Here lyeth muche rychnesse in lytell space.-- John Heywood$
He relyeth much erychnes seinly tells pace. --John Heywood ^M$

1.3 空白行の差を抑制する

-B または --ignore-blank-lines オプションは、空白行の挿入や削除を無視します。これらのオプションを用いると、例えばファイルが次のものを含んでいると、


1. A point is that which has no part.


2. A line is breadthless length.
-- Euclid, The Elements, I
これは次を含んでいるファイルと同等です。
1. A point is that which has no part.
2. A line is breadthless length.


-- Euclid, The Elements, I

通常、このオプションは、完全に空の行だけに影響しますが、 -b または --ignore-space-change オプション、または -w または --ignore-all-space オプションを指定するなら、行は、空のように見えるが、空白類を含んでいるなら、また、影響されます。言い換えれば、 -B はデフォルトで -I '^$' に同等ですが、 -b または -w も指定されるなら、 -I '^[[:space:]]*$' に同等です。

1.4 正規表現にマッチする行を抑制する

` grep'-形式の正規表現にマッチする行の挿入と削除を無視するためには、 -I REGEXP または --ignore-matching-lines=REGEXP を使用します。シェルのメタ文字がシェルで展開されるのを避けるために、正規表現をエスケープするべきです。例えば、` diff -I '^[[:digit:]]'' は、数字で始まる行のすべての変更を無視します。

しかしながら、 -I は、hunk 内のすべての変更行が -- すべて挿入と削除で -- 正規表現にマッチするなら、正規表現を含んでいる行の挿入と削除のみを無視します。言い替えると、無視できない変更に対し、 diff は、それに隣接する変更の完全な組を無視できるものも含めて印刷 (出力) します。

1 つ以上の -I オプションを使用して、行を無視するために 1 つ以上の正規表現を指定することができます。 diff は、それぞれの正規表現に対し、それぞれの行のマッチを試みます。

1.5 大文字小文字の差を抑制する

GNU diff では、例えば、` Funky Stuff', ` funky STUFF' と ` fUNKy stuFf' がすべて同じ名前だと考えるように、小文字がそれに対応する大文字と同等な物として扱うことができます。こうするために、 -i または --ignore-case オプションを使用します。

1.6 ファイルの差の概要

ファイルが異なっているかどうかを知りたいだけのときで、差異が何かに注目していないとき、概要を出力する書式を使用することがでいます。この書式では、ファイル間の差を表示する代わりに、 diff は単純にファイルに差異があるかどうかを報告します。 -q または --brief オプションでこの書式を選択します。

この書式は、2 つのディレクトリの内容を比較するとき特に役に立ちます。 diff は、差異があることが分かるとすぐにファイルの解析を停止することができるので、それは普通に行ごとに比較するより遥かに速くもなります。

cmp を使用することで、2 つのファイルが違っているかどうかを、短く示しているものを得ることもできます。同じであるファイルに関しては、 cmp は、なにも出力を生成しません。ファイルが異なっているとき、 cmp は、デフォルトで、最初の差異が発生したところでバイトと行番号を出力するか、または 1 つのファイルがもう片方の接頭辞であると報告します。 cmp が出力を生成せず、ファイルが異なっているかどうかを終了ステータスだけで報告するようにするため、その情報を抑制するために -s, --quiet または --silent オプションを使用することができます ("Invoking cmp"参照)。

diff とは異なり、 cmp はディレクトリを比較することはできません。 2 つのファイルの比較のみ行えます。

1.7 バイナリファイルと、強制的なテキストファイルの比較

diff が比較している 2 つのファイルのうちの一方がバイナリ (テキストファイルではない) と考える場合、通常ファイルの組を概要の出力書式が選択されているように ("Brief"参照) 扱い、バイナリファイルが異なっていることだけを報告します。これは、行単位での比較がバイナリファイルに対して普通は意味が無いためです。

ファイルの最初の数バイトを調査して、 diff はファイルがテキストかバイナリかを決定します。正確なバイト数はシステムに依存しますが、それは通常数千になります。ファイルの一部のすべてのバイトがヌル文字ではないなら、 diff はファイルがテキストだと見なします。そうでなければ、ファイルがバイナリだと見なします。

時々、 diff に、ファイルがテキストであると見なして欲しいかもしれません。例えば、ヌル文字が含まれているテキストファイルを比較するかもしれません。 diff は誤って、これらをテキストファイルではないと決定するでしょう。また、ヌル文字を特殊なフォーマットを示すために使用するワープロシステムで使用されているフォーマットのファイルを比較するかもしれません。 -a または --text オプションを使用することで、 diff に強制的にすべてのファイルがテキストファイルであると見なし、行ごとにそれらを比較させることができます。このオプションを使用して比較しているファイルが、実際にはテキストを含んでいないなら、おそらくファイルには数個の改行文字しかなく、 diff の出力は、ファイルに含まれているすべての文字からなる長い行の差異を表示する hunk になります。

ファイルが (どのように異なっているかではなく) 異なっているかどうかのみを報告するように diff に強制させることができます。このためには -q または --brief オプションを使用します。

通常、バイナリファイルの差は、 diff の出力結果がすべての差を取り切れないので、問題となります。この問題の場合、 diff はステータス 2 で終了します。しかしながら、この問題は -a または --text オプションを使用するか、または -q または --brief オプションを使用して発生しないので、これらどちらのオプションでも、 diff はバイナリファイルをテキストファイルのように扱います。

テキストファイルとバイナリファイルで差があるオペレーティングシステムでは、 diff は通常、すべてのデータをテキストとして読み書きします。代わりにバイナリデータとして diff に読み書きさせるために、 --binary オプションを使用します。このオプションは、GNU または伝統的な Unix システムのような POSIX 準拠のシステムでは効果がありません。しかしながら、多くのパーソナルコンピュータのオペレーティングシステムでは、行末の改行の後にキャリッジリターンが存在します。そのようなシステムでは、 diff は通常入力されるこれらのキャリッジリターンを無視し、それぞれの出力の行末にキャリッジリターンを生成しますが、 --binary オプションを用いると diff はそれぞれのキャリッジリターンをそのまま入力文字として扱い、それぞれの出力の行末にキャリッジリターンを生成しません。 POSIX 準拠のシステムで変換する予定のテキストではないファイルを扱うとき、これは役に立ちます。

--strip-trailing-cr で、 diff は行末の改行にキャリッジリターンが続いている入力行を普通の改行として扱います。多くのパーソナルコンピュータのオペレーティングシステムからインポートされた不完全なテキストを比較するとき、これは役に立ちます。このオプションは行が読み込まれる方法に影響があり、それは順次、比較される方法と出力の方法に影響していきます。

2 つのファイルをバイト単位で比較したい場合、2 つのファイルのバイトごとの差の値を表示するために、 -l または --verbose オプションを用いて cmp プログラムを使用することができます。 GNU cmp を用いると、これらのバイトの ASCII 表現を表示するために -b または --print-bytes オプションを使用することもできます。詳細については "Invoking cmp"を参照してください。

比較しているファイルのいずれかを diff3 がバイナリ (テキストではないファイル) と考えるなら、そのような比較は普通意味が無いので、通常はエラーを報告します。 diff3 は、ファイルがバイナリかどうかを diff が決定するテストと同じテストを使用します。 diff と同様に、入力ファイルにテキストでないバイトが含まれているが、それ以外はテキストファイルに似ているなら、 -a または --text オプションを使用することで、 diff3 にすべてのファイルをテキストファイルと見なさせ、行単位での比較を強制させることができます。

 

2 `diff' の出力書式

diff には、出力書式に対する相互に排他的なオプションがいくつかあります。次のセクションではそれぞれの書式を記述し、2 つのサンプル入力ファイル間の差を diff が報告する方法を図示します。

2.1 2 つのサンプル入力ファイル

diff の出力と、様々なオプションがどのようにしてそれを変更するかを説明するために多くの例で使用する 2 つのサンプルファイルを次に示します。

これはファイル ` lao' です:


The Way that can be told of is not the eternal Way;
The name that can be named is not the eternal name.
The Nameless is the origin of Heaven and Earth;
The Named is the mother of all things.
Therefore let there always be non-being,
so we may see their subtlety,
And let there always be being,
so we may see their outcome.
The two are the same,
But after they are produced,
they have different names.

これはファイル ` tzu' です:


The Nameless is the origin of Heaven and Earth;
The named is the mother of all things.


Therefore let there always be non-being,
so we may see their subtlety,
And let there always be being,
so we may see their outcome.
The two are the same,
But after they are produced,
they have different names.
They both may be called deep and profound.
Deeper and more profound,
The door of all subtleties!

この例では、最初の hunk には ` lao' の最初の 2 つの行が含まれ、 2 番目の hunk には ` lao' の 4 行目と対応する ` tzu' の 2 行目と 3 行目が含まれ、そして、最後の hunk には ` tzu' の最後の 3 行が含まれます。

2.2 コンテキストを用いた差の表示

通常、ファイル間の差を見るときは、正確に何が変更されたのかを理解する手助けとなる、ファイルの差がある行の周りの部分も見たいでしょう。このようなファイルの周りの部分を "context" (コンテキスト) と呼びます。

GNU diff は異なっている行の周りの文を表示する、2 つの出力書式を提供します: "context format" (コンテキスト書式) と "unified format" (一体化した書式) です。それで、異なっている行が見つかった関数やファイルのセクションを追加表示することができます。

diff の出力形式で、他人にファイルの新しいバージョンを配布するなら、彼らがファイルに独自の変更をしている場合でも差分を適用できるように、周りの文を表示する出力形式の 1 つを使用すべきです。 patch は、このような場合、異なっている行の周りの文の行をファイル内で探すことによって差分を適用することができます。これらの行が差分が告げている場所から実際には数行離れていても、 patch は行番号を調整し、差分を正しく適用することができます。不完全な差分を適用するために patch を使用する場合の詳細については、 "Imperfect"を参照してください。

2.2.1 コンテキスト (context) 書式

コンテキストを使用した出力書式は、異なっている行の周りの文の数行を表示します。それはソースコードの更新部分を配布するための標準的な書式です。

この出力形式を選択するために、 -C LINES, --context[=LINES] または -c オプションを使用します。これらのオプションのいくつかが受けとる引数 LINES は、表示する周りの文の行数です。 LINES を指定しないなら、それはデフォルトで 3 行になります。適切に処理するため、 patch は通常少なくとも 2 行の周りの文を必要とします。

2.2.1.1 コンテキストを使用した書式の例

コマンド ` diff -c lao tzu' の出力は対のようになります (完全な 2 つのファイルの内容については、"Sample diff Input"参照)。差の無い行が 3 行になるまで、差がある行の周りの行が表示されていることに注意してください。それらは周りの文の行です。周りの文が重なっているため、最初の 2 つの hunk は一緒になっていることにも注意してください。


*** lao 2002-02-21 23:30:39.942229878 -0800
--- tzu 2002-02-21 23:30:50.442260588 -0800
***************
*** 1,7 ****
- The Way that can be told of is not the eternal Way;
- The name that can be named is not the eternal name.
The Nameless is the origin of Heaven and Earth;
! The Named is the mother of all things.
Therefore let there always be non-being,
so we may see their subtlety,
And let there always be being,
--- 1,6 ----
The Nameless is the origin of Heaven and Earth;
! The named is the mother of all things.
!
Therefore let there always be non-being,
so we may see their subtlety,
And let there always be being,
***************
*** 9,11 ****
--- 8,13 ----
The two are the same,
But after they are produced,
they have different names.
+ They both may be called deep and profound.
+ Deeper and more profound,
+ The door of all subtleties!

2.2.1.2 より少ないコンテキストを用いた、コンテキストを使用した書式の例

コマンド ` diff -C 1 lao tzu' の出力は次のようになります (完全な 2 つのファイルの内容については、Sample diff Input:: 参照)。ここでは最大 1 行が報告されていることに注意してください。


*** lao 2002-02-21 23:30:39.942229878 -0800
--- tzu 2002-02-21 23:30:50.442260588 -0800
***************
*** 1,5 ****
- The Way that can be told of is not the eternal Way;
- The name that can be named is not the eternal name.
The Nameless is the origin of Heaven and Earth;
! The Named is the mother of all things.
Therefore let there always be non-being,
--- 1,4 ----
The Nameless is the origin of Heaven and Earth;
! The named is the mother of all things.
!
Therefore let there always be non-being,
***************
*** 11 ****
--- 10,13 ----
they have different names.
+ They both may be called deep and profound.
+ Deeper and more profound,
+ The door of all subtleties!

2.2.1.3 コンテキストを使用した書式の詳細な説明

周りの文を使用した出力書式は、2 行のヘッダを用いて開始され、それは次のようになります:


*** FROM-FILE FROM-FILE-MODIFICATION-TIME
--- TO-FILE TO-FILE-MODIFICATION TIME

タイムスタンプは通常、日付、有理数の秒を使用した時間、そして Internet RFC 2822 format (ftp://ftp.isi.edu/in-notes/rfc2822.txt) のタイムゾーンを示すため `2002-02-21 23:30:39.942229878 -0800' のようになります。 (有理数の秒は、有理数のタイムスタンプをサポートしないホストで除外されます。) しかしながら、` LC_TIME' ロケールカテゴリが ` C' または ` POSIX' のいずれかであるなら、伝統的なタイムスタンプ ` Thu Feb 21 23:30:39 2002' が使用されます。

ヘッダの内容を --label=LABEL オプションを使用して変更することができます。 "Alternate Names"を参照してください。

次に 1 つ以上の差異の hunk が続きます。それぞれの hunk はファイルの差異のある部分の 1 つの領域を表示します。コンテキストを使用した書式では、 hunk は次のようになります:


***************
*** FROM-FILE-LINE-NUMBERS ****
FROM-FILE-LINE
FROM-FILE-LINE...
--- TO-FILE-LINE-NUMBERS ----
TO-FILE-LINE
TO-FILE-LINE...

hunk が 2 つ以上の行を含んでいるなら、行番号は ` START,END' のように見えます。そうでなければ、終わりの行番号だけが現れます。空の hunk が hunk に先行する行で終わると見なされます。

差異のある行の周りの行は、2 つの空白文字を用いて開始されます。 2 つのファイル間で異なっている行は、次の識別文字の 1 つで開始され、空白文字が続きます:

!
2 つのファイル間で変更されている 1 行以上のまとまった部分の行です。この hunk 部分の ` !' で印が付いている行のまとまりに対応するものが、もう一方のファイルに存在します。
+
最初のファイルには対応するものが無い、2 番目のファイルに "挿入された"行です。
-
2 番目のファイルには対応するものが無い、最初のファイルから "削除された"行です。

hunk の変更がすべて挿入されたものであるなら、FROM-FILE の行は省略されます。変更のすべてが削除されているなら、TO-FILE の行は省略されます。

2.2.2 一体化した (unified) 書式

一体化した出力書式は周りの文を使用した書式の変形で、冗長な周りの行を省略していて、よりコンパクトになっています。この出力書式を選択するため、 -U LINES, --unified[=LINES] または -u オプションを使用します。引数 LINES は、表示する周りの行数です。与えられていないとき、デフォルトは 3 行です。

現在のところ、GNU diff だけがこの書式を生成することができ、 GNU patch だけがこの書式の差分を自動的に適用することができます。適切に処理するため、 patch は通常、少なくとも周りの 3 行を必要とします。

2.2.2.1 一体化した (unified) 書式の例

ここに、コマンド ` diff -u lao tzu' の出力です (2 つのファイルの内容の完全なものについては、Sample diff Input:: 参照)。


--- lao 2002-02-21 23:30:39.942229878 -0800
+++ tzu 2002-02-21 23:30:50.442260588 -0800
@@ -1,7 +1,6 @@
-The Way that can be told of is not the eternal Way;
-The name that can be named is not the eternal name.
The Nameless is the origin of Heaven and Earth;
-The Named is the mother of all things.
+The named is the mother of all things.
+
Therefore let there always be non-being,
so we may see their subtlety,
And let there always be being,
@@ -9,3 +8,6 @@
The two are the same,
But after they are produced,
they have different names.
+They both may be called deep and profound.
+Deeper and more profound,
+The door of all subtleties!

2.2.2.2 一体化した書式の詳細な記述

一体化した出力書式は 2 行のヘッダで開始され、それは次のようになります:


--- FROM-FILE FROM-FILE-MODIFICATION-TIME
+++ TO-FILE TO-FILE-MODIFICATION-TIME

タイムスタンプは、日付、有理数の秒とタイムゾーンを示すために、 ` 2002-02-21 23:30:39.942229878 -0800' のようになります。有理数の秒は、有理数のタイムスタンプをサポートしないホストで除外されます。

ヘッダの内容を、 --label=LABEL オプションを用いて変更することができます。 "Alternate Names"を参照してください。

次に、差異部分の hunk が 1 つ以上続きます。それぞれの hunk はファイルの差異部分の 1 つの領域を表示します。一体化した (unified) 書式の hunk は次のようになります:


@@ FROM-FILE-LINE-NUMBERS TO-FILE-LINE-NUMBERS @@
LINE-FROM-EITHER-FILE
LINE-FROM-EITHER-FILE...

hunk がちょうど 1 つの行を含んでいるなら、スタート行番号だけが現れます。そうでなければ、行番号は ` START,COUNT' のように見えます。空の hunk は、hunk に続く線で開始すると見なされます。

hunk とそのコンテキストが 2 つ以上の行を含んでいるなら、行番号は ` START,COUNT' のように見えます。そうでなければ、終わりの行番号だけが現れます。空の hunk は、hunk に先行する行で終わると見なされます。

両方のファイルでの共通部分は、空白文字で開始されます。 2 つのファイル間で実際に差のある行には、次の左側の列に出力されている指示文字の 1 つがあります:

+
最初のファイルの、ここに 1 行追加されました。
-
最初のファイルから、ここの 1 行が削除されました。

2.2.3 差異のある領域が存在するセクションの表示

それぞれの変更がファイルのどの部分かを知りたいでしょう。ファイルがソースコードであるなら、これは変更された関数を意味します。ファイルがドキュメントであるなら、変更された章や付録を意味します。 GNU diff では、差異のある行の前にあるセクション見出し行で最も近くにあるものを表示することで、これを示すことができます。 "section headings" (セクション見出し) の行は、正規表現で決定されます。

2.2.3.1 正規表現にマッチする行を表示する

C やそれに似た言語以外のソースコードのファイルで差異が生じたセクションを表示するためには、 -F REGEXP または --show-function-line=REGEXP オプションを使用します。 diff は、` grep' 形式の正規表現 REGEXP にマッチした行が、ファイルのセクションの先頭だと見なします。いくつかの一般的な言語に対する正規表現の提案を示します:

` ^[[:alpha:]$_]'
C, C++, Prolog
` ^('
Lisp
` ^@node'
Texinfo

このオプションでは出力書式を自動的に選択しません。それを使用するために、コンテキストを使用した書式 ("Context Format"参照) または一体化した書式 ("Unified Format"参照) を選択しなければなりません。それ以外の出力書式では効果はありません。

-F または --show-function-line オプションで、差異があるそれぞれの hunk の前にある変更されていない最も近い行で与えられた正規表現にマッチする行を見つけます。そしてその行を、周りの文を使用した書式のアスタリスクがある行の終りに、または一体化した書式の ` @@' 行に追加します。マッチする行がないなら、このオプションは、そのまま変更されずに、hunk のための出力に残ります。その行が 40 文字以上であるなら、それらは最初の 40 文字だけ出力されます。そのような行に対し、1 つ以上の正規表現を指定することができます。 diff は、それぞれの行に対しそれぞれの正規表現にマッチすることを、最後に与えられたものから試します。これは、望むなら -p-F を一緒に使用できることを意味します。

2.2.3.2 C の関数の見出しを表示する

C とそれに似た言語で差異の生じた関数を表示するために、 -p または --show-c-function オプションを使用することができます。このオプションで、デフォルトのコンテキストの行数を用いたコンテキストを使用した出力書式を自動的にデフォルトにします ("Context Format"参照)。コマンドラインのどこかで -C LINES を用いることで、その行数に優先させることができます。コマンドラインのどこかで -U LINES を用いることで、その書式と行数に優先させることができます。

-p または --show-c-function オプションは、一体化した (unified) 書式が指定されているなら、`-F '^[[:alpha:]$_]'' と同じで、そうでなければ、`-c -F '^[[:alpha:]$_]'' と同じです ("Specified Headings"参照)。 GNU diff は利便性を目的としてこのオプションを提供しています。

2.2.4 ファイル名の代替物を表示する

意味が無かったり情報として価値の無い名前を持つ二つのファイルを比較する場合、周りの文を利用したり一体化した出力書式のヘッダに、名前の変わりのものを diffで表示させたいかもしれません。こうするために --label=LABEL オプションを使用します。最初にこのオプションを与えると、ヘッダ内の最初のファイルの名前と日付をその引数で置換し、2 回与えると、ヘッダ内の 2 番目のファイルの名前と日付をその引数で置換します。このオプションが 2 回以上与えられる場合、 diff はエラーを報告します。 --label オプションは、 -l または --paginate オプションが使用されている ("Pagination"参照) とき、 pr ヘッダ内のファイル名に影響しません。

`diff -C 2 --label=original --label=modified lao tzu' の出力の最初の 2 行は次のようになります:


*** original
--- modified

2.3 差異を並べて表示する

diff では、2 つのファイルの差異のリストを並べて生成することができます。縦段落間の溝を用いてファイルは 2 列にリストアップされます。縦段落間の溝は次のマーカの 1 つを含んでいます。

white space (空白類)
共通の対応する行です。すなわち、それぞれの行は同じ、または --ignore オプション ("White Space"参照) の 1 つで無視されている差しかありません。
` '
対応する行に差があり、両方とも完全または両方とも不完全です。
` <'
ファイルに差があり、最初のファイルだけに含まれている行です。
` >'
ファイルに差があり、2 番目のファイルだけに含まれている行です。
` ('
最初のファイルだけに含まれている行ですが、差異は無視されます。
` )'
2 番目のファイルだけに含まれている行ですが、差異は無視されます。
` \'
対応する行に差があり、最初のファイルの行のみが不完全です。
` /'
対応する行に差があり、2 番目のファイルの行のみが不完全です。

通常出力行は、それは不完全な行が含まれている場合だけ不完全です。 "Incomplete Lines"参照。しかしながら、出力行が 2 つの差異のある行に表示されるとき、一方は不完全でもう一方はそうでないかもしれません。この場合は、出力行は完全ですが、その縦段落間の溝は、最初の行が不完全であるなら、` \' で、2 番目の行が不完全であるなら、` /' で印が付いています。

並べた書式が最も読み易いときもありますが、それには制限があります。それは通常よりはるかに幅広の出力を生成し、長過ぎると切り詰められます。また、通常より出力の整列状態に強く依存するので、可変幅フォント、標準的ではないタブストップ、または表示不可能な文字を使用しているなら、その出力は特に見栄えが悪くなります。

並べた差異を対話的にマージするために、 sdiff コマンドを使用することもできます。ファイルのマージの詳細については、"Interactive Merging"を参照してください。

2.3.1 並べた書式の制御

-y または --side-by-side オプションで並べた書式を選択します。並んでいる出力行には 2 つの入力行が含まれるので、出力は通常より幅広になります: 通常は 130 列出力され、それは伝統的なプリンタの行に適しているはずです。出力の幅を -W COLUMNS または --width=COLUMNS オプションを用いて設定することができます。出力は同じ幅で半分に分けられ、差異に印を付ける小さな縦段落間の溝で分けられています。入力行が長過ぎて出力の半分に適さないものは、出力で切り詰められます。

--left-column オプションで、2 つの共通列の左の列のみ印刷します。 --suppress-common-lines オプションで、完全に共通の行の出力を抑制します。

2.3.2 並べた出力の例

コマンド ` diff -y -W 72 lao tzu' の出力は次のようになります (2 つのファイルの完全な内容については、"Sample diff Input"参照)。


The Way that can be told of is n <
The name that can be named is no <
The Nameless is the origin of He The Nameless is the origin of He
The Named is the mother of all t ⎪ The named is the mother of all t
>
Therefore let there always be no Therefore let there always be no
so we may see their subtlety, so we may see their subtlety,
And let there always be being, And let there always be being,
so we may see their outcome. so we may see their outcome.
The two are the same, The two are the same,
But after they are produced, But after they are produced,
they have different names. they have different names.
> They both may be called deep and
> Deeper and more profound,
> The door of all subtleties!

2.4 コンテキストを使用しない差の表示

"normal" diff 出力の書式は、周囲の文を付けずに差異部分のそれぞれの hunk を表示します。そのような出力は、変更されていない周りの行に邪魔されず、行が変更された様子を見るには最も明確なときもあります (しかし、周りの文を 0 行使用した、周りの行を用いた書式や一体化した書式を使用して、同様な結果を得ることもできます)。しかしながら、この書式をパッチの送付に広く使用することはもうありません。その目的では、コンテキストを使用する書式 ("Context Format"参照) と、一体化された (unified) 書式 ("Unified Format"参照) がより好まれます。通常の書式は、古いバージョンの diff と POSIX 標準との互換性のため、デフォルトになっています。この出力書式を明示的に選択するためには --normal オプションを使用します。

2.4.1 通常の書式の例

コマンド ` diff lao tzu' の出力は次のようになります (完全な 2 つのファイルの内容については、"Sample diff Input"をを参照)。を2 つのファイルで異なっている行のみが表示されていることに注目してください。


1,2d0
< The Way that can be told of is not the eternal Way;
< The name that can be named is not the eternal name.
4c2,3
< The Named is the mother of all things.
---
> The named is the mother of all things.
>
11a11,13
> They both may be called deep and profound.
> Deeper and more profound,
> The door of all subtleties!

2.4.2 通常書式の詳細な説明

通常の出力書式は、1 つ以上の差異部分の hunk を含んでいます。それぞれの hunk はファイルの差の 1 つの領域を表示します。通常の書式の hunk は次のようになります:


CHANGE-COMMAND
< FROM-FILE-LINE
< FROM-FILE-LINE...
---
> TO-FILE-LINE
> TO-FILE-LINE...

3 つの形式の変更コマンドがあります。それぞれ、最初のファイルの行番号またはコンマで分けられた行の範囲、変更方法の種類を示す単一文字、そして、2 番目のファイルの行番号またはコンマで分けられた行の範囲です。すべての行番号は、それぞれのファイルのもともとの行番号です。変更コマンドのタイプは次の通りです:

` LaR'
最初のファイルの L 行の後に、2 番目のファイルの範囲 R に行を追加します。例えば、` 8a12,15' は、1 のファイルの 8 行目の後に 2 のファイルの 12-15 行を追加することを意味します。または、変更が 2 から 1 であるなら、ファイル 2 の 12-15 行を削除します。
` FcT'
最初のファイルの F の範囲の行を、2 番目のファイルの T の範囲の行で置換します。これは、追加と削除の組み合わせに似ていますが、よりコンパクトです。例えば、` 5,7c8,10' は、ファイル 1 の 5-7 行をファイル 2 の 8-10 行に変更することを意味します。または、変更が 2 から 1 であるなら、ファイル 2 の 8-10 行をファイル 1 の 5-7 行に変更します。
` RdL'
最初のファイルから範囲 R の行を削除します。行 L は、2 番目のファイルに削除されているようにみえる場所です。例えば、` 5,7d3' はファイル 1 の 5-7 行を削除することを意味します。または、変更が 2 から 1 であるなら、ファイル 2 の 3 行目の後にファイル 1 の 5-7 行を追加します。

2.5 編集スクリプトの作成

出力モードには、TO-FILE を生成するために FROM-FILE ファイルを編集する、コマンドスクリプトを生成します。

2.5.1 `ed' スクリプト

diff で、 ed テキストエディタに最初のファイルを 2 番目のファイルに変更するように指示するコマンドを生成することができます。以前はこれが、あるファイルをもう 1 つのファイルに自動的に編集することに適した唯一の出力モードでした。現在は、 patch を用いることになり、それはもう時代遅れです。この出力書式を選択するためには、 -e または --ed オプションを使用します。

通常の書式 ("Normal"参照) と同様に、この出力書式では周りの文を全く表示しません。通常の書式とは異なり、(2 番目のファイルと差分がある場合、最初のファイルを生成するために) 逆に差分を適用するのに必要な情報を含んでいません。

ファイル ` d' に ` diff -e old new' の出力が含まれているなら、コマンド ` (cat d && echo w) ⎪ ed - old' で ` old' が ` new' のコピーになるように編集します。より一般的には、` d1', ` d2', ..., ` dN' がそれぞれ、` diff -e old new1', ` diff -e new1 new2', ..., ` diff -e newN-1 newN' の出力になっているなら、 `(cat d1 d2 ... dN && echo w) ⎪ ed - old' で ` old' `が ` newN' のコピーになるように編集します。

2.5.1.1 `ed' スクリプトの例

` diff -e lao tzu' の出力は次のようになります (2 つのファイルの完全な内容については、"Sample diff Input"参照)。


11a
They both may be called deep and profound.
Deeper and more profound,
The door of all subtleties!
.
4c
The named is the mother of all things.


.
1,2d

2.5.1.2 `ed' 書式の詳細な記述

ed 出力書式は、1 つ以上の差異部分の hunk から成り立ちます。複数行を変更するコマンドで、 ed コマンドの成功によって行番号を解釈する方法に影響しないように、ファイルの終りに近い変更が最初に来ます。 ed 書式の hunk は次のようになります:


CHANGE-COMMAND
TO-FILE-LINE
TO-FILE-LINE...
.

ed は行中のピリオドを入力の終りを示すものとして使用するので、 GNU diff は、行中の単一のピリオドを二つのピリオドとして書き込み、それに続く ed コマンドで 2 つのピリオドを 1 つに変更することで、変更された行を保護します。 ed 書式は不完全な行を表現することが不可能なので、2 番目のファイルの終りが変更のある不完全な行の場合、 diff はエラーを報告し、改行を追加するように要求します。

3 つのタイプの変更コマンドがあります。それぞれ、最初のファイルの行番号やコンマで分離されている行の範囲と変更させる手法を示す単一文字から成り立ちます。すべての行番号は、ファイルの元々の行番号です。変更コマンドのタイプは次の通りです:

` La'
最初のファイルの L 行目の後に 2 番目のファイルからのテキストを追加します。例えば ` 8a' は、ファイル 1 の 8 行目以降に、それに続く行を追加することを意味します。
` Rc'
最初のファイルの範囲 R の行を、それに続く行で置換します。追加と削除の組み合わせに似ていますが、よりコンパクトです。例えば ` 5,7c' は、ファイル 1 の 5-7 行をファイル 2 のテキストで変更することを意味します。
` Rd'
最初のファイルから範囲 R の行を削除します。例えば、` 5,7d' は、ファイル 1 の 5-7 行を削除することを意味します。

2.5.2 前方 `ed' スクリプト

diffed スクリプトのような出力を生成することができますが、 hunk は (前のものを後ろにする) 前方への順序を使用します。コマンドの書式を若干変更することも可能です。それは、変更した行の前にコマンド文字前置すること、範囲を空白で分離した行番号にすること、そして、単一のピリオドから成り立つ hunk 行を明示する試みを行なわないことです。 ed 書式のように、前方 ed 書式は、不完全な行を表現することはできません。

前方 ed 書式は、 ed でも patch でもこの書式の差分を適用することができないので、ほとんど役に立ちません。それは主に、古いバージョンの diff との互換性のために存在しています。それを選択するためには、 -f または --forward-ed オプションを使用します。

2.5.3 RCS スクリプト

RCS 出力書式は、異なるファイルのバージョンとシステムを管理するために使用するフリープログラム、Revision Control System で使用するために設計されています。この出力書式を選択するためには、 -n または --rcsオプションを使用します。前方 ed 書式 ("Forward ed"参照) に似ていますが、それは前方 ed 書式の単一のピリオドを含む行と不完全な行の問題を避けているので、ファイルの内容の任意の変更を表現することができます。単一のピリオドを含む行でテキストセクションを終える代わりに、それぞれのコマンドで影響する行数を指定します。 ` a' と ` d' コマンドの組み合わせは、` c' の代わりに使用されます。また、2 番目のファイルが変更されている不完全な行で終る場合、出力も不完全な行で終ります。

` diff -n lao tzu' の出力は次のようになります (2 つのファイルの完全な内容については、"Sample diff Input"参照)。


d1 2
d4 1
a4 2
The named is the mother of all things.


a11 3
They both may be called deep and profound.
Deeper and more profound,
The door of all subtleties!

2.6 If-then-else を用いたファイルのマージ

2 つの C ソースコードをマージするために diff を使用することができます。この書式の diff の出力は、両方のファイルのすべての行を含みます。両方のファイルに共通の行は、1 回だけ出力されます。差異のある部分は、C プリプロセッサの指示語の ` #ifdef NAME' または `#ifndef NAME', ` #else' と ` #endif' で分離されています。出力をコンパイルするとき、マクロ NAME を定義したり未定義にしたりすることで、バージョンを選択します。

2 つのファイルをマージするために、 -D NAME または --ifdef=NAME オプションを用いて diff を使用します。引数 NAME は、` #ifdef' と ` #ifndef' 指示語で使用する C プリプロセッサの識別子です。

例えば、` wait (&s)' の文を `waitpid (-1, &s, 0)' に変更し、新旧のファイルを --ifdef=HAVE_WAITPID オプションを用いてマージしたなら、影響する部分のコードは次のようになります:


do {
#ifndef HAVE_WAITPID
if ((w = wait (&s)) < 0 && errno != EINTR)
#else /* HAVE_WAITPID */
if ((w = waitpid (-1, &s, 0)) < 0 && errno != EINTR)
#endif /* HAVE_WAITPID */
return w;
} while (w != child);

次のセクションで説明する、行のグループを使用した書式と、行の書式を使用することで、C 以外の言語に対する書式を指定することができます。

2.6.1 行のグループを使用した書式

行のグループを使用した書式で、プログラミング言語とテキストの書式化言語が含まれる、if-then-else の入力が可能な多くのアプリケーションに適した書式を指定することができます。行のグループを使用した書式で、類似した行の連続したグループに対して出力書式を指定します。

例えば、次のコマンドで、TeX ファイルの ` old' と ` new' を比較し、古い領域の周りに ` \begin{em}'-` \end{em} 行を書き、新しい領域の周りに ` \begin{bf}'-` \end{bf}' 行を書くことで、出力をマージします。


diff --old-group-format='m}
%<\nd{em}
' --new-group-format='
%>\nd{bf}
' old new

次のコマンドは上記の例と同等ですが、デフォルトの行のグループを使用した書式で綴っているので、若干冗長です。


diff \
--old-group-format='\begin{em}
%<\end{em}
' \
--new-group-format='\begin{bf}
%>\end{bf}
' \
old new

次はより高度な例で、"plain English"形式の行番号を含むヘッダを用いて差分リストを出力します。


diff \
--unchanged-group-format='' \
--old-group-format='-------- %dn line%(n=1?:s) deleted at %df:
%<' \
--new-group-format='-------- %dN line%(N=1?:s) added after %de:
%>' \
--changed-group-format='-------- %dn line%(n=1?:s) changed at %df:
%<-------- to:
%>' \
old new

行のグループを使用した書式を指定するために、以下でリストされたオプションの 1 つで diff を使用します。行のグループを使用した書式のうち 4 つまで指定することが可能で、それぞれの行のグループの種類になります。通常 FORMAT はシェルのメタ文字を含んでいるので、引用符で囲むべきです。

--old-group-format=FORMAT
これらの行のグループは、最初のファイルの行だけに含まれている hunk です。デフォルトの古いグループの書式は、指定されているなら、変更されたグループの書式と同じです。そうでなければ、行のグループはそのまま出力される書式になります。
--new-group-format=FORMAT
これらの行のグループは、2 番目のファイルの行だけに含まれている hunk です。デフォルトの新しいグループの書式は、指定されているなら、変更されたグループの書式と同じです。そうでなければ、行のグループはそのまま出力される書式になります。
--changed-group-format=FORMAT
これらの行のグループは、両方のファイルの行を含んでいる hunk です。デフォルトで、変更されたグループの書式は、新旧のグループの書式を連結したものです。
--unchanged-group-format=FORMAT
これらの行のグループは、両方のファイルに共通な行を含んでいます。デフォルトで、変更されていないグループの書式は、行のグループをそのまま出力する書式です。

行のグループを使用した書式では、通常の文字はそのまま表示されます。伝統的な仕様は、` %' で始まり次の形式の 1 つが続きます。

` %<'
最初のファイルからの行を意味し、それは最後の改行を含めます。それぞれの行は、古い行の書式に依存して書式化されます ("Line Formats"参照)。
` %>'
2 番目のファイルからの行を意味し、それは最後の改行を含めます。それぞれの行は、新しい行の書式に依存して書式化されます。
` %='
両方のファイルに共通な行を意味し、それは最後の改行を含めます。それぞれの行は、変更されていない行の書式に依存して書式化されます。
` %%'
` %' を意味します。
` %c'C''
ここで C は単一文字で、C を意味します。 C をバックスラッシュやアポストロフィにしてはいけません。例えば、` %c':'' はコロンを意味し、if-then-else 書式の then-part 内部ではコロンは通常終端文字ですが、そのままの意味になります。
` %c'\O''
ここで O は、1 桁、2 桁または 3 桁の 8 進数で、8 ビットコード O の文字を意味します。例えば、` %c'\0'' はヌル文字を意味します。
` FN'
ここで F は、` printf' の変換を指定し、N は次の文字の 1 つになり、 F で書式化される N の値を意味します。
` e'
古いファイルのグループの直前の行の行番号です。
` f'
古いファイルのグループの最初の行の行番号です。 E + 1 と同じです。
` l'
古いファイルのグループの最後の行の行番号です。
` m'
古いファイルのグループ直後の行の行番号です。 L + 1 と同じです。
` n'
古いファイルのグループの行番号です。 L - F + 1 と同じです。
` E, F, L, M, N'
同様に、新しいファイルの行です。

` printf' の変換指定は、` %d', ` %o', ` %x' または ` %X' を指定でき、それぞれ、10 進数、8 進数、小文字の 16 進数または大文字の 16 進数の出力を指定しています。 ` %' の後に続くオプションを順番に表します: 0 以上のフラグの列。最小フィールド幅の整数。そして、ピリオドに続く桁数の最小値を指定する追加の整数。フラグは、左寄せに対する -、` LC_NUMERIC' ロケールのカテゴリによって指定される、グループごとの桁数に分離する `''、そして、空白の代わりに 0 でパディングするための ` 0' です。例えば、` %5dN' はグループの新しい行の数を、` printf' の書式 ` "%5d"' を使用して、5 文字幅のフィールドで印刷 (出力) します。

` (A=B?T:E)'
A が B に等しいなら T、それ以外は E となります。 A と B はそれぞれ 10 進数の定数または上記で解釈される単一文字です。この書式指定は、A の値が B の値に等しいなら T と同等になります。そうでなければ、E と同等になります。

例えば ` %(N=0?no:%dN) line%(N=1?:s)' は、N (新しいファイルのグループの行数) が 0 であるなら、`no lines' と同等で、 N が 1 であるなら、` 1 line' と同等で、そうでなければ、` %dN lines' と同等になります。

2.6.2 行の書式

行の書式は、if-then-else 書式での行のグループの部分として入力行から出力行に持っていく行数を制御します。

例えば、次のコマンドは、テキストの左に変更を示す単一の文字を用いてテキストを出力します。出力の最初の文字は、削除行に対する -、追加行に対する ` '、そして変更されていない行に対する空白です。その書式には、出力に概況が必要な場所では、改行文字が含まれます。


diff \
--old-line-format='-%l
' \
--new-line-format='⎪%l
' \
--unchanged-line-format=' %l
' \
old new

行の書式を指定するために、次のオプションの 1 つを使用します。シェルのメタ文字を含むことが多いので、FORMAT を引用符で囲むべきです。

--old-line-format=FORMAT
最初のファイルからの行だけ書式化します。
--new-line-format=FORMAT
2 番目のファイルからの行だけ書式化します。
--unchanged-line-format=FORMAT
両方のファイルに共通の行を書式化します。
--line-format=FORMAT
すべての行を書式化します。実際には、上記の 3 つのオプションすべてを同時に設定します。

行の書式では、通常の文字はそれ自身を示します。変換指定は ` %' で始まり、次の形式の 1 つを用います。

` %l'
行の内容を意味し、後置される改行は (存在しても) 数えません。この書式は行が不完全かどうかを無視します。 "Incomplete Lines"を参照してください。
` %L'
行の内容を意味し、後置される改行を (存在する場合) 含みます。行が不完全であるなら、この書式はその不完全さを保持します。
` %%'
` %' を意味します。
` %c'C''
ここで、C は単一文字で、C を意味します。 C をバックスラッシュまたはアポストロフィにしたりしてはいけません。例えば、` %c':'' はコロンを意味します。
` %c'\O''
ここで、O は 1 桁、2 桁または 3 桁の 8 進数で、8 進コード O の文字を意味します。例えば、` %c'\0'' はヌル文字を意味します。
` Fn'
ここで、F は ` printf' の変換指定で、F で書式化された行番号を意味します。例えば、` %.5dn' は、` printf' の書式 ` "%.5d"' を使用して行番号を印刷 (出力) します。 printf 変換指定の詳細については、 Line Group Formats を参照してください。

デフォルトの行の書式は、改行文字が続く ` %l' です。

入力にタブ文字が含まれていて、それが出力行にとって重要であるなら、行の書式の ` %l' または ` %L' をタブの直後に書くか (例えば、` %l' または ` %L' を前置してタブ文字を使用します)、 -t または --expand-tabs オプションを使用すべきです。

行と行のグループの書式を組み合わせると、様々な書式を指定することが可能となります。例えば、次のコマンドで、通常の diff の書式に似たものを使用します。 diff の出力を詳細に制御するために、このコマンドに手を加えることもできます。


diff \
--old-line-format='< %l
' \
--new-line-format='> %l
' \
--old-group-format='%df%(f=l?:,%dl)d%dE
%<' \
--new-group-format='%dea%dF%(F=L?:,%dL)
%>' \
--changed-group-format='%df%(f=l?:,%dl)c%dF%(F=L?:,%dL)
%<---
%>' \
--unchanged-group-format='' \
old new

2.6.3 If-then-else 書式の例

` diff -DTWO lao tzu' の出力は次のようになります (2 つのファイルの完全な内容については、"Sample diff Input"を参照)。


#ifndef TWO
The Way that can be told of is not the eternal Way;
The name that can be named is not the eternal name.
#endif /* ! TWO */
The Nameless is the origin of Heaven and Earth;
#ifndef TWO
The Named is the mother of all things.
#else /* TWO */
The named is the mother of all things.


#endif /* TWO */
Therefore let there always be non-being,
so we may see their subtlety,
And let there always be being,
so we may see their outcome.
The two are the same,
But after they are produced,
they have different names.
#ifdef TWO
They both may be called deep and profound.
Deeper and more profound,
The door of all subtleties!
#endif /* TWO */

2.6.4 If-then-else 書式の詳細な説明

両方のファイルで共通の行に対し、 diff は変更されていない行のグループ書式を使用します。マージされた出力書式の差異部分のそれぞれの hunk に対し、 hunk が最初のファイルの行だけを含んでいるなら、 diff は古い行のグループ書式を使用します。 hunk が 2 番目のファイルの行だけを含んでいるなら、 diff は新しい行のグループ書式を使用します。そうでなければ、 diff は変更されたグループ書式を使用します。

古いもの、新しいもの、そして変更されている行の書式はそれぞれ、最初のファイルの行、2 番目のファイルの行、そして両方のファイルに共通の行の出力書式を指定します。

オプション --ifdef=NAME は、次のシェルの構文を使用した連続したオプションと同等です。


--old-group-format='#ifndef NAME
%<#endif /* ! NAME */
' \
--new-group-format='#ifdef NAME
%>#endif /* NAME */
' \
--unchanged-group-format='%=' \
--changed-group-format='#ifndef NAME
%<#else /* NAME */
%>#endif /* NAME */
'

適切に入れ子状にするため、 diff の出力を注意深く調べるべきです。例えば、 -D NAME または --ifdef=NAME オプションを使用するとき、差異のある行が C のプリプロセッサの指示語 ` #ifdef', ` #ifndef', ` #else', ` #elif' または ` #endif' を含んでいるかどうかを調べるべきで、それらはおそらく入れ子状になっているのでマッチします。そうでないなら、手動で正しくしなければなりません。望んだように本当になっていることを確実にするため、コードの結果を注意深く調べるのは良い考えです。入力ファイルが生成される方法に依存して、出力が 2 重になったものが含まれたり、正しくないコードになったりします。

patch -D NAME オプションは、ファイルとマージされたファイルを生成する差分で処理を行なうことを除いて、 diff -D NAME と同じように動作します。 "patch Options"を参照してください。

 

3 不完全な行

入力ファイルが改行ではない文字で終るとき、最後の文字が改行ではないので、その最後の行は "incomplete line" (不完全な行) と呼ばれます。それ以外のすべての行は "full lines" (完全な行) と呼ばれ、改行文字で終ります。空白類 ("White Space"参照) の差異が無視されないなら、不完全な行は完全な行にマッチしません。

不完全な行は、` \' で開始される行が続く完全な行の出力とは、通常区別されます。しかしながら、RCS 書式 ("RCS"参照) では、改行もそれに続く行も用いず、不完全な行をそのまま出力します。並べた書式では、不完全な行を通常そのまま表示しますが、場合によっては、 ` \' または ` /' ガーターマーク (溝の印) を使用します。 "Side by Side"を参照してください。 if-then-else の行の書式は、不完全な行を ` %L' で保持し、` %l' で改行を破棄します。 "Line Formats"を参照してください。最後に、 ed と前方 ed出力書式では ("Output Formats"参照)、 diff は不完全な行を表示することができないので、改行があることを要求し、エラーを報告します。

例えば、` F' と ` G' が 1 バイトのファイルで、それぞれ ` f' と ` g' を含んでいると仮定します。そして、` diff F G' は、次を出力します。


1c1
< f
\ No newline at end of file
---
> g
\ No newline at end of file

(正確なメッセージは英語以外のロケールとは異なります。) ` diff -n F G' は、改行を後置すること無く次を出力します:


d1 1
a1 1
g

` diff -e F G' は、2 つのエラーを報告し、次を出力します:


1c
g
.

 

4 ディレクトリの比較

2 つのディレクトリツリーでファイルのいくつかまたはすべてを比較するために、 diff を使用することができます。 diff への引数が両方ともディレクトリのとき、両方のディレクトリに含まれているそれぞれのファイルを、 ` LC_COLLATE' ロケールカテゴリによって指定されているように、アルファベット順に比較します。通常、 diff は、差異の無いファイルの組に対しては何も出力しませんが、 -s または --report-identical-files オプションを使用しているなら、同一ファイルの組も報告します。通常、 diff は、サブディレクトリの比較を行なわず、両方のディレクトリに共通のサブディレクトリについて報告しますが、 -r または --recursive オプションを使用しているなら、可能な限り深いレベルまで、ディレクトリツリーの対応するファイルの組ごとに比較をします。

一方のディレクトリだけにあるファイル名に対して、 diff は通常、存在するファイルの内容を表示しません。ファイルがディレクトリに存在し、もう一方には存在しないことだけを報告します。実際に存在するファイルの内容全部を出力するように、もう一方のディレクトリにファイルは存在するが空のファイルであるかのように、 diff に動作させることもできます。 (該当するものが最初または 2 番目のディレクトリにあるかどうかに依存して、挿入または削除として出力します。) こうするために、 -N または --new-file オプションを使用します。

古いディレクトリに 1 つ以上の大きなファイルがあり、新しいディレクトリには無いなら、 -N の代わりに --unidirectional-new-file オプションを使用することによって、パッチをより小さくすることができます。このオプションは、最初のディレクトリには無く 2 番目ディレクトリにあるファイル (すなわち、追加されたファイル) の内容だけを挿入することを除いて、 -N に似ています。パッチの最初に、ユーザが適用するパッチで、パッチを適用する前に削除されたファイルを削除するように命令を書きます。配布物へのパッチを作成する議論については、"Making Patches"を参照してください。

ディレクトリを比較している間にいくつかのファイルを無視するために、 `-x PATTERN' または --exclude=PATTERN オプションを使用します。このオプションで、シェルのパターン PATTERN にマッチするベース名のファイルやサブディレクトリを無視します。シェルとは異なり、ファイル名のベースの最初のピリオドはパターンの最初のワイルドカードにマッチします。シェルが展開しないように、PATTERN を引用符で囲むべきです。例えば、オプション -x '*.[ao]'で、` .a' または ` .o' で終る名前のファイルを無視します。

このオプションは 1 回以上指定したなら、累積されます。例えば、オプション -x 'RCS' -x '*,v' を使用することで、ベース名が ` RCS' または ` ,v' で終るファイルやディレクトリを無視します。

このオプションを何回も与える必要があるなら、その代わりにパターンをファイルに書き込み、 -X FILE または --exclude-from=FILE オプションを使用することができます。後続する空白類と空の行はパターンファイルの中で無視されます。

2 つのディレクトリを比較していて途中で停止したなら、その後で残りを続けたいかもしれません。 -S FILE または --starting-file=FILE オプションを使用することによって、それを行うことができます。これで、最上位レベルのディレクトリで、ファイル FILE とアルファベット順でそれ以降のファイルだけを比較します。

2 つのディレクトリで、ファイル名が一方のディレクトリでは小文字で、もう一方では大文字になっているという差しかないなら、 diff は通常、大文字小文字を区別してファイル名を比較するので、多くの差異を報告します。 --ignore-file-name-case オプションを用いると、例えば一方のディレクトリのファイル ` Tao' の内容と、もう一方のファイル ` TAO' の内容を比較するように、 diff はファイル名の大文字小文字を無視します。 --no-ignore-file-name-case オプションで、 --ignore-file-name-case オプションの効果をキャンセルし、デフォルトの動作に戻ります。

--ignore-file-name-case が効果があるときに、 -x PATTERN または --exclude=PATTERN オプション、または -X FILE または --exclude-from=FILE オプションが指定されているなら、指定されているパターンにマッチしたファイル名を除外するとき、大文字小文字を無視します。

 

5 Making `diff' の出力をより良くする

diff は、出力の見え方を調整する方法をいくつかの提供しています。これらの調整は、あらゆる出力書式に適用することができます。

5.1 タブストップの位置合わせを保持する

いくつかの diff 出力書式のテキストには, テキストが挿入されている、削除されている、または変更されていることを示す 1 文字または 2 文字が前に置かれます。これらの文字を追加することで、タブが次のタブストップに移動し、行での列の位置揃えがなくなります。 GNU diff は、行でのタブによる列の位置揃えを正しくする 2 つの方法を提供しています。

最初の方法は、 diff で出力する前に、すべてのタブを正しい数の空白に変換することです。この手法は、 -t または --expand-tabs オプションで選択します。この形式の出力を patch で使用するために、 patch-l または --ignore-white-space オプションを与えなければなりません (詳細については、"Changed White Space"参照)。 diff は通常、タブストップを 8 列ごとに設定されていると仮定しますが、 --tabsize=COLUMNS オプションによって、これを変更することができます。

タブの行の揃えを正しくするもう 1 つの方法は、空白の代わりにタブを、行の最初の指示文字の後に追加する方法です。これで、それ以下のすべてのタブ文字が元のファイルでのタブストップに対応して、出力の位置合わせが正しくなるように、同じ場所に確実に位置します。その欠点は、行が余りに長くなり過ぎて、画面や用紙の 1 行に適さないようになることです。また、それは、変更形式を示す文字の後に空白文字がない、一体化した (unified) 出力書式で動作しません。この手法は、 -T または --initial-tab オプションで選択します。

5.2 `diff' 出力のページ分割

長い出力にページ番号を付けたり、タイムスタンプを付けることが便利にできます。 -l または --paginate は、 diff の出力を pr プログラムに渡すことによって、これを行います。ここで、` diff -lc lao tzu' のように見えるページヘッダを示します:


2002-02-22 14:20 diff -lc lao tzu Page 1

 

6 `diff' の性能のトレードオフ

GNU diff は、効率的に実行します。しかしながら、状況によってはより速く、より小さな変更の組を生成させることができます。

diff の効率を改善する方法の 1 つは、コピーの代わりにハードリンクやシンボリックリンクを使用することです。 diff は通常、同じファイルへの 2 つのハードリンクやシンボリックリンクは内容が同じはずなので読み込む必要がないため、これで効率が向上します。例えば、大きなディレクトリ階層をコピーして、コピーに対しいくつか変更して、オリジナルとコピーを比較するのに ` diff -r' を使用することが多いと仮定します。オリジナルのファイルが読み込み専用であるなら、ハードリンクやシンボリックリンクを使用してコピーを作成する (例えば、GNU ` cp -lR' または ` cp -sR' を用いる) ことで、効率をかなり向上することができます。コピーのファイルを最初に編集する前に、リンクを切って、通常のコピーで置換すべきです。

ファイル比較の方法を変更するオプションを与えることによって、 GNU diff の効率に影響を与えることもできます。パフォーマンスには、2 つ以上の側面があります。これらのオプションは、他のものを犠牲にして効率改善の見地で実装されていたり、他のものに害を与えながら、場合によっては効率を向上したりします。

GNU diff が変更された行を決定する方法は、行が、常に最小限の差異の集合で見つけ出して、変更されていることで決定します。通常それは、実用的な目的としては十分です。 diff の出力が大きいなら、より小さな差異の集合を生成するために、 diff を修正されたアルゴリズムで使用したいかもしれません。 -d または --minimal オプションでこうなります。しかしながら、通常は diff の実行が遅くなるかもしれないので、デフォルトの動作ではありません。

比較しているファイルが大きく、全体を通じて変更部分の小さな集合が点在しているとき、 diffが使用するアルゴリズムとは異なる変更を行なう、
--speed-large-files オプションを使用することができます。入力ファイルが一定して小さな密度で変更されているとき、このオプションで出力を変更することなく比較の速度が向上します。そうでないなら、 diff は大きな差異の組を生成するかもしれません。しかしながら、出力は正しいままです。

通常 diff は、差異部分の最小組を見つけようとする前に、両方のファイルに共通な最初の部分と終りの部分を破棄します。これで diff の実行は速くなりますが、最小の出力ではなくなります。 --horizon-lines=LINES オプションは、 diff が最初の部分の最後の LINES 行と終りの部分の最初の LINES 行を破棄することを妨げます。これで、 diff はより最小の出力を見つけることになります。

変更された行に連続する行が含まれていて、それ以外では同一行が連続していると仮定します。 diff コマンドは、hunk に含まれてる連続した同じ部分を自由に選択します。この場合、 diff は通常、隣接する hunk をマージするときは hunk の境界をシフトするか、または hunk の行をファイルの終りまでシフトします。 hunk のマージは、ある場合に、出力行の見栄えを良くするかもしれません。

 

7 3 つのファイルの比較

3 つのファイルを比較し、それらの間の差異を表示するため、プログラム diff3 を使用します。 ( diff3 でファイルのマージもできます。 "diff3 Merging"参照)。

"normal" diff3 の出力書式は、周りの文を用いずに、それぞれの差異部分の hunk を表示します。 hunk には、それが 2 方向か 3 方向かに依存してラベルが付けられてて、行には、入力ファイルの位置で注釈がつきます。

diff3 の実行する方法の詳細については、"Invoking diff3"を参照してください。

7.1 3 番目の入力ファイルの見本

ここで、 diff3 の出力とオプションでそれを変更する様子を示す例で使用する 3 番目のサンプルファイルを示します。最初の 2 つのファイルは、 diff で使用したものと同じです ("Sample diff Input"参照)。次は、` tao' という 3 番目のサンプルファイルです:


The Way that can be told of is not the eternal Way;
The name that can be named is not the eternal name.
The Nameless is the origin of Heaven and Earth;
The named is the mother of all things.


Therefore let there always be non-being,
so we may see their subtlety,
And let there always be being,
so we may see their result.
The two are the same,
But after they are produced,
they have different names.


-- The Way of Lao-Tzu, tr. Wing-tsit Chan

7.2 `diff3' の通常の書式の例

コマンド ` diff3 lao tzu tao' の出力は次のようになります (ファイルの完全な内容については、"Sample diff3 Input"参照)。 3 つのファイル間で差異のある行だけが表示されていることに注意してください。


====2
1:1,2c
3:1,2c
The Way that can be told of is not the eternal Way;
The name that can be named is not the eternal name.
2:0a
====1
1:4c
The Named is the mother of all things.
2:2,3c
3:4,5c
The named is the mother of all things.


====3
1:8c
2:7c
so we may see their outcome.
3:9c
so we may see their result.
====
1:11a
2:11,13c
They both may be called deep and profound.
Deeper and more profound,
The door of all subtleties!
3:13,14c


-- The Way of Lao-Tzu, tr. Wing-tsit Chan

7.3 `diff3' の通常の書式の詳細な説明

それぞれの hunk は ` ====' で印がついた行で始まります。 3 方向の hunk には、` ====' 行があり、2 方向の hunk には、その hunk に差異のある 3 つの入力ファイルのいずれかを示す、` 1', ` 2' または ` 3' が付け足されます。 hunk には、入力行がどこからのものかを示す 1 つまたは 2 つのコマンドによって前に置かれる、入力行の 2 つまたは 3 つの組のコピーが含まれます。

通常、コマンドごとに異なる入力号のコピーに 2 つの空白が前に置かれます。しかし、 -T または --initial-tab オプションを用いると、 diff3 は 2 つの空白の代わりにタブを使用します。これでタブの行揃えは正しくなります。詳細については、"Tabs"を参照してください。

コマンドは次の形式となります:

` FILE:La'
この hunk は、ファイル FILE の行 L 以降にあり、そのファイルに含まれていない行です。もう一方のファイルを生成するべくこのファイルを編集するため、もう一方のファイルから得られる hunk 行を付け加えなければなりません。例えば、` 1:11a' は最初のファイルの 11 行以降の hunk で、そのファイルにその行が含まれていないことを意味します。
` FILE:Rc'
この hunk は、ファイル FILE の範囲 R の行を含みます。範囲 R はコンマで分離されている行番号の組、または範囲が単一行の場合、 1 つの数字だけになります。もう一方のファイルを生成するべくこのファイルを編集するため、指定された行を、もう一方のファイルから得られる行に変更しなければなりません。例えば、` 2:11,13c' は、hunk が 2 番目のファイルの 11 行から 13 行に含まれていることを意味します。

入力行の組の最後の行が不完全であるなら ("Incomplete Lines"参照)、 ` \' で始まる行が続く完全な行と出力は区別されます。

7.4 `diff3' の hunk

2 つまたは 3 つの入力ファイルの差分の行のグループは、"diff3 hunks"と呼ばれ、 diff の hunk に似ています ("Hunks"参照)。 diff3 の hunk で 3 つの入力ファイルがすべて異なるなら、hunk は "three-way hunk" (3 方向の hunk) と呼ばれます。 2 つの入力ファイルだけが異なるなら、それは "two-way hunk" (二方向の hunk) です。

diff と同様に、いくつかの解が考えられます。ファイル ` A', ` B' と ` C' を比較するとき、 diff3 は通常、2 つのコマンド ` diff A B' と ` diff A C' で出力される 2 方向の hunk をマージして、 diff3 の hunk を見つけます。これでは、必ずしも出力が最小になるわけではありませんが、例外は滅多にありません。

例えば、` F' には 3 行 ` a', ` b', ` f' が含まれ、 ` G' には行 ` g', ` b', ` g' が含まれていて、そして ` H' に行 ` a', ` b', ` h' が含まれていると仮定します。 ` diff3 F G H' は、次を出力します:


====2
1:1c
3:1c
a
2:1c
g
====
1:3c
f
2:3c
g
3:3c
h

その理由は、最初のファイルと 3 番目のファイルの ` a' が含まれる 2 方向の hunk と 2 番目のファイルの ` g'を見つけ、単一行の ` b' が 3 つのファイルすべての共通行として見つかり、それぞれのファイルの最後の行に含まれる 3 方向の hunk が見つかるためです。

 

8 共通の先祖からマージ

2 人の人が同じファイルのコピーへの変更を行なったとき、衝突している部分の警告を用いて、お互いの変更の両方を含んでいるマージされた出力を diff3 で生成することができます。

3 つ以上のファイルを同時に比較するために、 diff4diff5 のような名前のプログラムを想像するかもしれませんが、実際にそれが必要になることは滅多にありません。 2 つの変更の組を同時にマージすることで、3 つ以上のファイルの変更の組をマージするために、 diff3 を使用することができます。

diff3 で、2 つの修正されたバージョンから共通の以前のバージョンに変更を取り込むことができます。これで、2 つの新しいファイルに存在する変更された組をマージします。 2 番目の引数として共通の以前のバージョンを指定し、2 つの新しいバージョンを最初と 3 番目の引数として次のように指定します:


diff3 MINE OLDER YOURS

アルファベット順なので、引数の順番を覚えられるでしょう。

このことから、YOURS から OLDER を取り除いてその結果を MINE に追加したり、OLDER から YOURS への変更を MINE にマージしていると考えられます。このマージは、それぞれの変更が近くにあり、MINE と OLDER でマッチする限り明確です。すべての 3 つの入力ファイルが異なっているときや、OLDER だけが異なっているときはうまくいきません。これを "conflict" (衝突) と呼んでいます。 3 つの入力ファイルがすべて異なるとき、この衝突を "overlap" (オーバラップ) と呼んでいます。

diff3 は、オーバラップと衝突を処理する方法を提供します。オーバラップまたは衝突を削除したり、オーバラップだけを選択したり、衝突を特殊な ` <<<<<<<' と ` >>>>>>>' の行で印を付けることができます。

diff3 で、マージした出力を作成するために最初のファイルに適用することができる ed スクリプトとして、マージした結果を出力することができます。しかしながら、 diff3 でマージした出力を直接生成した方が良いでしょう。これで ed の問題も回避します。

8.1 組み込む変更を選択する

MINE にマージするために、 -e または --ed オプションを用いて、OLDER から YOURS へのマージされていないすべての変更を選択することができます。 -3 または --easy-only を用いて、オーバラップのないマージされていない変更だけを選択することができ、 -x または --overlap-only を用いて、オーバラップされている変更だけを選択することができます。

-e, -3-x オプションは、"unmerged changes" (マージされていない変更)、例えば、MINE と YOURS で変更が異なるところだけを選択します。 MINE と YOURS が同じところでは、変更部分は既にマージされていると仮定されるので、OLDER から YOURS への変更を無視します。この仮定が安全ではないなら、 -A または --show-all オプションを使用することができます ("Marking Conflicts"参照)。

これら 3 つのオプションをそれぞれ用いたコマンド diff3 の出力例は次のようになります (ファイルの完全な内容については、 "Sample diff3 Input"参照)。 -e の出力が -3-x によって出力される変更の組をバラして合体させたものになっていることに注意してください。

` diff3 -e lao tzu tao' の出力です:
11a


-- The Way of Lao-Tzu, tr. Wing-tsit Chan
.
8c
so we may see their result.
.

` diff3 -3 lao tzu tao' の出力です:
8c
so we may see their result.
.

` diff3 -x lao tzu tao' の出力です:
11a


-- The Way of Lao-Tzu, tr. Wing-tsit Chan
.

8.2 衝突の印づけ

diff3 で、衝突部分に特殊なマーカ行を用いてマージされた出力を囲むことで、印を付けることができます。 2 つのファイル A と B からの衝突は、次のように印が付きます:


<<<<<<< A
lines from A
=======
lines from B
>>>>>>> B

3 つのファイル A、B そして C からの衝突は、次のように印がつきます:


<<<<<<< A
lines from A
⎪⎪⎪⎪⎪⎪⎪ B
lines from B
=======
lines from C
>>>>>>> C

-A または --show-all オプションは、衝突部分を大カッコで囲み、マージされていない変更だけでなく、OLDER から YOURS へのすべての変更を出力することを除いて、 -e オプションのように振る舞います。このため、サンプルの入力ファイル ("Sample diff3 Input"参照) が与えられると、` diff3 -A lao tzu tao' は、` tzu' の差異部分の衝突の周りに大カッコを置きます:


<<<<<<< tzu
=======
The Way that can be told of is not the eternal Way;
The name that can be named is not the eternal name.
>>>>>>> tao

また、3 方向の衝突は次のように出力されます:


<<<<<<< lao
⎪⎪⎪⎪⎪⎪⎪ tzu
They both may be called deep and profound.
Deeper and more profound,
The door of all subtleties!
=======


-- The Way of Lao-Tzu, tr. Wing-tsit Chan
>>>>>>> tao

-E または --show-overlap オプションは、 -A または --show-all オプションより情報が少なくなりますが、それはマージされていない変更だけを出力し、2 番目のファイルの内容を出力しないためです。そのため、 -E オプションは、3 方向のオーバラップした変更で、最初と 3 番目のファイルが大カッコで囲むことを除いて、 -e オプションのように振る舞います。同様に、 -X は、(オーバラップが必要な) 変更のすべてを大カッコで囲むことを除いて、 -x のように振る舞います。例えば、上記のような 3 方向のオーバラップしている変更に対し、 -E-X オプションは次を出力します:


<<<<<<< lao
=======


-- The Way of Lao-Tzu, tr. Wing-tsit Chan
>>>>>>> tao

無意味で情報のない名前を持つファイルを比較しているなら、 ` <<<<<<<', ` ⎪⎪⎪⎪⎪⎪⎪' と ` >>>>>>>' の大カッコで別名を表示するために、 --label=LABEL オプションを使用することができます。このオプションで、それぞれの入力ファイルごとに、3 回まで与えることができます。従って、`diff3 -A --label X --label Y --label Z A B C' は、出力が、ファイル名 ` A', ` B' と ` C' ではなく、ファイル名 ` X', ` Y' と ` Z' からのようになることを除いて、 ` diff3 -A A B C' のように振る舞います。

8.3 マージされた出力を直接生成する

-m または --merge オプションを用いると、 diff3 はマージされたファイルを直接出力します。これは、それを生成するために ed を使用するより効果的で、 ed が除外するテキストではないファイルでも動作します。 ed スクリプトのオプションを使用せずに -m を指定するなら、 -A が仮定されます。

例えば、コマンド ` diff3 -m lao tzu tao' (入力ファイルのコピーについては、diff3 Input 参照) は、次を出力します:


<<<<<<< tzu
=======
The Way that can be told of is not the eternal Way;
The name that can be named is not the eternal name.
>>>>>>> tao
The Nameless is the origin of Heaven and Earth;
The Named is the mother of all things.
Therefore let there always be non-being,
so we may see their subtlety,
And let there always be being,
so we may see their result.
The two are the same,
But after they are produced,
they have different names.
<<<<<<< lao
⎪⎪⎪⎪⎪⎪⎪ tzu
They both may be called deep and profound.
Deeper and more profound,
The door of all subtleties!
=======


-- The Way of Lao-Tzu, tr. Wing-tsit Chan
>>>>>>> tao

8.4 不完全な行を `diff3' がマージする方法

-m を用いると、不完全な行 ("Incomplete Lines"参照) は見つかったものとして、単純に出力にコピーされます。出力の終りで衝突があり、入力ファイルの 1 つが不完全な行で終るなら、不完全な行が追加されるので、` ⎪⎪⎪⎪⎪⎪⎪', ` =======' または ` >>>>>>>' の大カッコは、行の最初ではない場所に現れます。

-m オプションを用いないと、 ed スクリプトのオプションが指定されていて、不完全な行が見つかるなら、 diff3 は警告を生成し、改行が存在しないかのように振る舞います。

8.5 変更されたファイルの保存

伝統的な Unix diff3 は、変更を保存するコマンド ` w' と ` q' を後続しない ed スクリプトを生成します。 System V diff3 は、これらの追加コマンドを生成します。 GNU diff3 は通常、伝統的な Unix diff3 のように振る舞いますが、 -i オプションを用いると、System V diff3 のように振る舞い、` w' と ` q' コマンドを後続します。

-i オプションは、 ed スクリプトのオプション -AeExX3 の 1 つを要求し、マージされた出力のオプション -m との互換性はありません。

 

9 `sdiff'を用いた対話的なマージ

sdiff を用いると、横に並べた -y 書式の比較を元にして ("Side by Side"参照)、2 つのファイルを対話的にマージすることができます。マージされたテキストを書く場所を指定するために、`-o FILE' または --output=FILE を使用します。 sdiff のオプションの詳細については、"Invoking sdiff"を参照してください。

ファイルを対話的にマージするもう 1 つの方法は、Emacs Lisp パッケージの ` emerge' を使用する方法です。詳細については、emerge: (emacs)emerge 参照。

9.1 `sdiff' に `diff' のオプションを指定する

次の sdiff オプションは、 diff と同じ意味があります。これらのオプションの使用については、"diff Options"を参照してください。


-a -b -d -i -t -v
-B -E -I REGEXP


--expand-tabs
--ignore-blank-lines --ignore-case
--ignore-matching-lines=REGEXP --ignore-space-change
--ignore-tab-expansion
--left-column --minimal --speed-large-files
--strip-trailing-cr --suppress-common-lines
--tabsize=COLUMNS --text --version --width=COLUMNS

歴史的な理由から、 sdiff は別名のあるオプションもあります。 -l オプションは --left-column オプションと同等で、同様に、 -s--suppress-common-lines と同等です。 sdiff-w-W オプションの意味は、 diff とは入れ換えられています: sdiff では、 -w COLUMNS--width=COLUMNS と同等で、 -W--ignore-all-space と同等です。 -o オプションを用いない sdiff は、 -y または --side-by-side オプション ("Side by Side"参照) を用いた diff と同等です。

9.2 マージコマンド

空白の溝 (gutter) を用いている共通行のグループは、最初のファイルから出力へコピーされます。差異のある行のそれぞれの行の後に、 sdiff は ` %' のプロンプトを出力して一時停止し、次のコマンドの 1 つを待ちます。それぞれのコマンドに <RET>を続けます。

` e'
どちらのバージョンも破棄します。空の一時ファイルでテキストエディタを呼び出し、編集結果のファイルを出力にコピーします。
` eb'
2 つのバージョンを連結し、一時ファイルでその結果を編集し、次に、編集結果を出力にコピーします。
ed
それぞれのバージョンに、ファイルや行があるバージョンを表示するヘッダが前に付けられることを除いて、` eb' に似ています。
` el'
 
` e1'
左のバージョンのコピーを編集し、その結果を出力にコピーします。
` er'
 
` e2'
右のバージョンのコピーを編集し、その結果を出力にコピーします。
` l'
 
` 1'
左のバージョンを出力にコピーします。
` q'
終了します。
` r'
 
` 2'
右のバージョンを出力にコピーします。
` s'
共通の行を黙ってコピーします。
` v'
冗長な出力を出しながら共通の行をコピーします。これはデフォルトです。

呼び出されるテキストエディタは、` EDITOR' 環境変数が設定されていればそれで指定されます。デフォルトはシステムに依存します。

 

10 `patch' を用いてマージする

patch は、 diff で生成される比較された出力を受けとり、パッチをあてたバージョンを生成しながら、オリジナルファイルのコピーに差分を適用します。 patch を用いることで、ファイルをすべて配布する代わりに、変更したファイルの組だけを配布することができます。取引先では、変更したファイルのコピーを更新するために patch を適用することができます。 patch は差分の書式を自動的に決定し、前後のヘッダを飛ばし、パッチをあてるファイルを決定するためにヘッダを使用します。これで、通信相手は、変更部分のリスト含むメールのメッセージを直接 patch に送れます。

patch は、後戻りするパッチのような一般的な問題を検出し警告を発します。それは適用することができなかったパッチを保存します。また、通信相手が適切な順序で差分を適用することを確実にするため、 ` patchlevel.h' ファイルを管理することができます。

patch は、標準入力から連続した差分を受け入れ、それは通常、パッチをあてるファイルを指定するヘッダで分離されています。それは、 diff の hunk ("Hunks"参照) を 1 つずつ適用します。 hunk が元ファイルに正確にマッチしないなら、 patch はできる限り発見的手法を用いてパッチをあてるファイルを見つけようとします。適切にマッチしている部分を見つけることが不可能であるなら、 patch は hunk を除外し、次の hunk をスキップします。 patch は通常、hunk (が存在するなら) を ` F.rej' に置き、それぞれのファイル F を新しいバージョンで置換します。

patch のオプションの詳細については、"Invoking patch"を参照してください。

10.1 `patch' の入力書式の選択

patch は、パッチファイルで使用している diff の書式を、その内容を調査して決定します。特定の複雑な前置テキストの 1 つが含まれているパッチファイルに対し、 patch がパッチファイルを特定の書式の差分であると解釈するように、次のオプションの 1 つを使用する必要があるかもしれません。次でリストされている出力書式は、 patch が理解可能なものだけです。

-c
 
--context
コンテキストを使用した差分。
-e
 
--ed
ed スクリプト。
-n
 
--normal
通常の差分。
-u
 
--unified
一体化した (unified) 差分。

10.2 リビジョンコントロール

存在しない入力ファイルが、 patch でサポートされているリビジョンコントロールシステムにあるなら、 patch は通常、ユーザにリビジョンコントロールシステムからファイルを取得 (チェックアウト) するかどうかを尋ねます。 patch は現在、RCS、ClearCase と SCCS をサポートしています。 RCS と SCCS では、 patch は入力ファイルが読み込み専用でデフォルトのバージョンがリビジョンコントロールシステムのものとマッチするときにも質問します。

-g NUM または --get=NUM オプションは、サポートされているリビジョンコントロールシステムのファイルへのアクセスに影響します。 NUM が正であるなら、 patch はユーザに尋ねることなくファイルを取得します。 0 であるなら、 patch はファイルを取得するかどうかをユーザに尋ねます。そして、負であるなら、 patch はファイルを取得する前にユーザに尋ねます。 NUM のデフォルト値は、` PATCH_GET' 環境変数が設定されているなら、それで与えられます。設定されていなければ、 patch が POSIX に準拠しているなら、デフォルト値は 0 で、そうでなければ、負になります。 "patch と POSIX"を参照してください。

リビジョンコントロールシステムの選択は、` VERSION_CONTROL' 環境変数に影響しません ("Backup Names"参照)。

10.3 不完全なパッチの適用

patch は、パッチファイルに先導するテキストをスキップし、差分を適用し、そして後続するテキストをスキップします。したがって、メールのメッセージを直接 patch に送ることができ、それはうまく動作するでしょう。差分全体が固定数の空白類で字下げされているなら、 patch は、自動的に字下げを無視します。コンテキストを使用した差分が、それぞれの行に後続するキャリッジリターンが含まれているなら、 patch は自動的にキャリッジリターンを無視します。コンテキストを使用した差分が、 Internet RFC 934 (ftp://ftp.isi.edu/in-notes/rfc934.txt) によって、` -' で始まる行に ` - ' を前に付けることによってカプセル化されているなら、 patch は自動的に入力のカプセル化を外します。

しかしながら、他の形式の不完全な入力では、ユーザが介入したりテストしたりする必要があります。

10.3.1 空白類が変更されているパッチを適用する

メーラ、エディタ、またはその他のプログラムによって、空白類をタブに、またはその反対に変更するものもあります。これがパッチファイルまたは入力ファイルに対して生じているなら、ファイルは同じように見えますが、 patch はそれらを適切にマッチさせることができません。この問題が生じるなら、パッチファイルの空ではない連続した空白が入力ファイルの空ではない連続した空白にマッチできるように、 patch が空白文字 (例えば、空白とタブ) の比較を曖昧にさせる、 -l または --ignore-white-space オプションを使用します。空白ではない文字は正確にマッチするはずです。周りの文のそれぞれの行は、入力ファイルの行にマッチするはずです。

10.3.2 リバースパッチを適用する

2 番目のファイルの代わりに最初の新しいファイルで diff を実行することもあります。これで "reversed" (リバース) の差分が生成されます。そのようなパッチを適用するためには、 patch-R または --reverse オプションを与えます。そして、 patch はそれぞれの hunk の周りを、それを適用する前に入れ換えようとします。除外されたものは入れ換えられた書式となります。

しばしば、 patch は、パッチがリバースであると推測することができます。パッチファイルの最初の hunk で失敗するなら、 patch は、リバースすることで適用できるかどうかを判定するために、hunk をリバースします。可能であるなら、 patch は、 -R オプションを設定したいかどうか尋ねます。不可能であるなら、 patch は通常通りパッチを適用し続けます。パッチが通常の差分で最初のコマンドが (削除されているはずの) 追加であるなら、空文はどこでもマッチするので、追加が常に成功するために、この手法でリバースパッチを検出することはできません。しかし、ほとんどのパッチは行を削除するのではなく追加したり変更したりしているので、ほとんどの通常のリバース差分は削除で始まり、失敗すると patch はそれに注目します。

既に適用しているパッチを適用するなら、 patch はそれをリバースパッチだと考え、パッチを逆に適用するように提案します。これは特長と言っても良いでしょう。不注意にこうしてしまい、パッチを逆に適用したくないなら、この提案と、それに続く "apply anyway" (適用する) という質問に ` n' と答えるか、-- または patch 処理を中止 (kill) するために ` C-c' をタイプします。

10.3.3 不正確なマッチを `patch' が見つけるように手助けをする

コンテクストを使用した差分と、より少ない範囲の通常の差分に対して、パッチが記述している行番号が正しくないとき、 patch は正しいものを検出することができ、パッチの hunk を適用する正しい場所を見つけようとします。最初の推測として、hunk に言及されている行番号を、以前の hunk に適用したオフセットを加えたり引いたりします。それが正しい場所ではないなら、hunk で与えられる周りの文に一致する行の前後を patch はスキャンします。

最初に patch は周りの文のすべての行がマッチする場所を探します。そのような場所を見つけることができず、コンテキストを使用している差分や一体化した (unified) 差分を読み込んでいて、最大の fuzz の要素が 1 以上に設定されているなら、 patch は、周りの文の最初と最後の行を無視して、もう一度スキャンします。それでも失敗し、最大の fuzz の要素が 2 以上に設定されているなら、周りの文の最初の 2 行と最後の 2 行を無視して、もう一度スキャンします。最大の fuzz の要素がそれより大きいなら、同様に続けます。

-F LINES または --fuzz=LINES オプションは、最大の fuzz の要素を LINES に設定します。このオプションは、コンテキストを使用している差分や一体化した (unified) 差分だけに適用されます。 hunk を導入する場所を探している間、LINES 行まで無視します。より大きな fuzz の要素で、不完全なパッチを作成する可能性が高くなることに注意してください。デフォルトの fuzz の値は 2 です。周りの文を使用した差分の行数、通常は 3 行以上に設定しても意味はありません。

patch がパッチの hunk を導入する場所を見つけることができないなら、 hunk をリジェクトファイルに出力します (リジェクトファイルの命名方法については、"Reject Names"を参照)。入力されるパッチの形式のまま、リジェクトされた周りの文を用いた書式の hunk を書き出しても問題ありません。入力が通常または ed の差分であるなら、周りの文の多くは単にヌルになります。リジェクトファイルの hunk の行数は、これらのパッチファイルとは異なります: それらは、失敗した hunk が、古いファイルではなく新しいファイルに属していると patch が考える適切な場所を表示します。

--verbose オプションが与えられているなら、それぞれの hunk が完了するときに、 patch は hunk が成功したか失敗したかを報告し、失敗したなら、hunk を適用すべき行だと patch が考える (新しいファイルの) 行を報告します。これが差分で指定されている行番号と異なるなら、そのオフセットを報告します。単一の大きなオフセットは、 patch が hunk を間違った場所に導入していることを示す_かもしれません_。また、 patch は、それがマッチを作るために fuzz 要素を使用したかどうか報告し、その場合も、わずかに不審に思うはずです。

patch は、行番号が ed スクリプトでオフになっているかどうかを報告することはできませんが、変更や削除コマンドになっている通常の差分での間違った行番号を検出することだけはできます。差分に表示されている周りの文の行数 (通常は 3) 以上の fuzz 要素を使用するコンテキストを使用した差分でも同じ問題があるかもしれません。このような場合に、変更することに意味があるかどうか確かめるために、オリジナルとパッチがあてられた入力との間をコンテキストを使用した差分でたぶん調べるべきです。エラーなく組み込まれると、パッチが動作したことを見事に示していますが、保証はありません。

空のファイルへのパッチは、存在しないファイルに適用され、その逆も真です。 "Creating と Removing"を参照してください。

patch は通常、たくさん推測する必要があっても、正しい結果を生成します。しかしながら、結果はパッチが生成されたファイルのコピーに正確に適用されるときだけ保証されます。

10.3.4 `patch' が行なうことの予測

patch が複雑な、または不完全な書式のパッチをどのように処理するかは、あらかじめ明確ではありません。入力で patch が間違ったファイルを編集することが心配であるなら、実際にファイルを変更することなく patch がパッチを適用した結果を印刷 (出力) する、 --dry-run オプションを使用することができます。 patch が期待したファイルを編集するかどうかを調べるために、予行演習をすることで生成される診断結果を、検査することができます。パッチが期待したものでないなら、パッチ (または patch の他のオプション) を変更して、もう一度予行演習することができます。パッチの目的に満足したら、 patch を前回と同様に呼び出すことで適用することができますが、このときは --dry-run オプションは用いません。

10.4 ファイルの作成と削除

2 つのディレクトリを比較しているとき、一方のディレクトリに存在しているファイルがもう一方には無いこともあるかもしれません。 diff-N または --new-file オプションを与えるなら、または、` /dev/null' という名前のファイルまたは空のファイルと Epoch (1970-01-01 00:00:00 UTC) の日付のファイルで、古いファイルまたは新しいファイルを提供するなら、 diff はこのファイルの内容を追加するか削除するパッチを出力します。そのようなパッチが与えられたとき、 patch は通常、新しいファイルを作成するか、または古いファイルを削除します。しかしながら、POSIX ("patch と POSIX"参照) に準拠するとき、 patch は古いファイルを削除せず、空のまま残します。 -E または --remove-empty-files オプションで、パッチを適用後に空になる出力ファイルを、パッチがファイルを削除するようには思われなくても patch は削除します。

パッチが既存のファイルを作成するように思われるなら、 patch は、パッチを適用する前に、確認のため尋ねてきます。

10.5 パッチファイルのタイムスタンプを更新

patch がファイルを更新するとき、通常ファイルの最終更新のタイムスタンプを現在の日時に設定します。ソフトウエア配布物の追跡に patch を使用しているなら、これで make は、パッチをあてたファイルが古いものだと間違って判断するかもしれません。例えば、` syntax.c' が syntax.y' に依存していて patchd が ` syntax.c' を更新してから syntax.y' を更新するなら、 ` syntax.y' が更新されているにもかかわらず、` syntax.c' はそれより古いものになります。

-Z または --set-utc オプションで、 patch はパッチをあてたファイルの編集時刻とアクセス時刻を、コンテキストを使用した差分のヘッダで与えられるタイムスタンプに設定します。コンテキストを使用した差分のヘッダに、タイムゾーンが指定されていないなら、 Coordinated Universal Time (しばしば GMT として知られている UTC) を使用すると仮定します。

-T または --set-time オプションは、コンテキストを使用した差分のヘッダのタイムスタンプを、UTC の代わりにローカルタイムを使用していると仮定することを除いて、 -Z または --set-utc のように振る舞います。ローカルタイムを使用しているパッチは、他のタイムゾーンにいる人が簡単に使用することができないので、そして、ローカルなタイムスタンプは、ローカルな時計が夏時間に調整されている間に後ろに戻るときあいまいであるので、このオプションは推奨されません。コンテキストを使用した差分のヘッダがタイムゾーンを指定しているなら、このオプションは、 -Z または --set-utc と同様です。

patch は通常、ファイルのオリジナルの最終更新のタイムスタンプが差分のヘッダで与えられる時間とマッチしないなら、ファイルの内容がパッチに正しくマッチしないなら、ファイルのタイムスタンプの設定をやめます。しかしながら、 -f または --force オプションが与えられるなら、ファイルのタイムスタンプに関係なく設定されます。

現在の diff 書式の制限のため、 patch は、内容が変更されていないファイルのタイムスタンプを更新することはできません。また、ファイルのタイムスタンプを現在の日時以外に設定するなら、後の make の呼び出しが、パッチをあてたファイルの時間で混乱しないように、パッチがあてられたファイルに依存するすべてのファイルも (例えば、` make clean') 削除するべきです。

10.6 ファイル内の複数のパッチ

パッチファイルが 1 つ以上のパッチを含んでいるなら、そして、コマンドラインで入力ファイルを指定していないなら、 patch は、それぞれのファイルを個別のパッチファイルから来たかのように適用しようとします。これは、それぞれのパッチに対するパッチをあてるファイル名を決定し、ファイル名に対するそれぞれのパッチの前に先導するテキストと、必要条件となるリビジョンレベルを調べるということを意味します (この話題の詳細については、 "Making Patches"を参照)。

パッチの前に先導されているテキストからファイル名を直観で知るために、 patch は、次の規則を使用します。最初に、 patch は次のような候補となるファイル名の順序つきリストを取ります。

*
ヘッダがコンテキストを使用した差分であるなら、 patch はヘッダで古いものと新しいファイル名を取ります。 -pNUM または --strip=NUM オプションを満足させるだけのスラッシュがないなら、名前は無視されます。 ` /dev/null' という名前も無視されます。
*
先導される不要な情報に ` Index:' 行があり、古い名前と新しい名前の両方とも無い、または patch が POSIX に準拠しているなら、 patch は ` Index:' 行の名前を取ります。
*
次の規則の目的のために、候補となるファイル名は、ヘッダに現れる順番を無視して、(古いもの、新しいもの、インデックスの) 順番にならんでいると見なされます。

それから、 patch は、次のような候補となるファイルのリストからファイル名を選択します:

*
指定されたファイルが存在するなら、 patch は、 POSIX に準拠しているなら、最初の名前を、そうでなければ最適な名前を選択します。
*
patch が RCS, ClearCase と SCCS ("Revision Control"参照) を無視せず、指定されたファイルが存在しないが、RCS, ClearCase または SCCS のマスタが見つかるなら、 patch は、RCS, ClearCase または SCCS のマスタで最初に指名されたファイルを選択します。
*
指名したファイルが存在しない、RCS, ClearCase または SCCS のマスタが見つからない、名前が与えられていない、 patch が POSIX に準拠していない、そしてパッチがファイルを作成するように思えるなら、 patch はディレクトリの作成が最小になるように、要求されている最適な名前を選択します。
*
上記の発見的手法の結果でもファイル名がないなら、パッチするためのファイル名を尋ねられ、 patch はその名前を選択します。

ファイル名の空ではない "最適な"リストを決定するため、 patch は最初に、パス名の構成要素を最小にして、すべての名前をとります。そして、最短のベース名ですべての名前を取ります。そして、すべての最短の名前を取ります。最後に、残っている最初の名前を取ります。

patch が POSIX に準拠しているかどうかを知るためには、 "patch と POSIX"を参照してください。

10.7 他のディレクトリでパッチを適用する

-d DIRECTORY または --directory=DIRECTORY オプションを patch に渡すと、ディレクトリ DIRECTORY を、パッチファイル内のファイル名と、( -B-o のような) その他のオプションの引数として与えられているファイル名の両方を解釈するためのカレントディレクトリとします。例えば、メールを読むプログラムで、` /usr/src/emacs' ディレクトリで、次のようなパッチを含むメッセージから直接ファイルにパッチをあてることができます:


⎪ patch -d /usr/src/emacs

パッチで与えられるファイル名に先導するディレクトリが含まれていますが、パッチで与えられているディレクトリとは異なるディレクトリにファイルを保持したいときもあります。そのような場合、ファイル名を NUMBER の数だけはぎ取って設定するために、 -pNUMBER または --strip=NUMBER オプションを使用することができます。取り除く数は、ファイル名の最初から取り除くために、ディレクトリ名が間にはいっている、スラッシュの数を patch に伝えます。 1 つ以上の隣接したスラッシュは、単一のスラッシュとして数えられます。デフォルトで、 patch はすべての先導するディレクトリをはぎ取り、ファイルのベース名だけを残します。

例えば、パッチファイルのファイル名が ` /gnu/src/emacs/etc/NEWS' だと想定します。 -p0 を使用すると、変更されていないすべてのファイル名が与えられ、 -p1 では、(先導するスラッシュがない) ` gnu/src/emacs/etc/NEWS' が与えられ、 -p4 では ` etc/NEWS' が与えられ、 -p をなにも指定しなければ、 ` NEWS' が与えられます。

patch はカレントディレクトリで、(すべてのスラッシュをはぎ取った後) それぞれのファイルを検索するか、または -d DIRECTORY を使用するなら、そのディレクトリを検索します。

10.8 バックアップファイル

通常、 patch が正確にオリジナルの入力ファイルにマッチしないなら、その場合には、` patch -R' ("Reversed Patches"参照) でパッチを元に戻すなら、オリジナルデータが元に戻らないので、バックアップファイルを作成します。しかしながら、POSIX に準拠しているとき、 patch は、デフォルトでバックアップファイルを作成しません。 "patch と POSIX"を参照してください。

-b または --backup オプションで、 patch は、パッチがオリジナルの入力にマッチするかどうかにかかわらずバックアップファイルを作成します。 --backup-if-mismatch オプションで、 patch はマッチしないファイルに対してバックアップファイルを作成します。これは、POSIX に準拠していないときのデフォルトです。 --no-backup-if-mismatch オプションで、 patch は、マッチしないファイルに対してもバックアップファイルを作成しません。これは、 POSIX に準拠してるときのデフォルトです。

バックアップファイルが存在しないとき、存在しないファイルを表現するための代替物として、空の読み込み不可能なバックアップファイルが作成されます。

10.9 バックアップファイル名

通常、 patch は、オリジナルの入力ファイルを、その名前に拡張子 ` .orig'、または ` .orig' がバックアップファイル名として 長すぎるなら、` ~' を付け加えることによってバックアップファイルとして名前を変えます (1)。 -z BACKUP-SUFFIX または --suffix=BACKUP-SUFFIX オプションで、 patch は、代わりのバックアップの拡張子として BACKUP-SUFFIX を使用します。

代わりに、` SIMPLE_BACKUP_SUFFIX' 環境変数でバックアップファイルの拡張子を指定することもできますが、オプションが優先されます。

patch では、GNU Emacs のように番号付のバックアップファイルを作成することもできます。この手法を用いることで、それぞれのファイルに対して単一のバックアップファイルを持つ代わりに、 patch は、ファイルにパッチを当てるたびに新しいバックアップファイルを作成します。例えば、` sink' と名前がつけられたファイルのバックアップは、連続して、` sink.~1~', ` sink.~2~', ` sink.~3~' 等になります。

-V BACKUP-STYLE または --version-control=BACKUP-STYLE オプションは、バックアップファイルを作成する手法を引数として取ります。代わりに、 patch は ` PATCH_VERSION_CONTROL' 環境変数を用いて作成するバックアップの形式を制御することもできますが、 -V オプションが優先します。 ` PATCH_VERSION_CONTROL' が設定されていないなら、 ` VERSION_CONTROL' 環境変数が代わりに使用されます。これらのオプションと変数がバックアップファイルの名前を制御することに注意してください。それらは、リビジョンコントロールシステムの選択には影響しません ("Revision Control"参照)。

環境変数の値と -V オプションへの引数は、GNU Emacs の ` version-control' 変数に似ています (Emacs のバックアップバージョンの詳細については、 "Backup Names": (emacs)Backup Names 参照)。それらは、より説明的な同義語も認識します。有効な値は次にリストされます。一意に求まる省略も受け付けます。

` t'
 
` numbered'
常に番号付のバックアップファイルを作成します。
` nil'
 
` existing'
既に存在しているファイルの番号付のバックアップを作成し、それ以外では単純なバックアップを作成します。これはデフォルトです。
` never'
 
` simple'
常に単純なバックアップを作成します。

patch に、ディレクトリ名のような接頭辞を付けてバックアップファイルを作成するるように伝えることもできます。 -B PREFIX または --prefix=PREFIX オプションで、 PREFIX を先頭に追加したバックアップファイルを作成します。 -Y PREFIX または --basename-prefix=PREFIX で、バックアップファイル名の最後のファイル名の構成要素の代わりに PREFIX を先頭に追加します。例えば、 -Y ~ で ` dir/file.c' のバックアップファイルは ` dir/~file.c' になります。これらの接頭辞オプションのいずれかを使用するなら、接尾辞をベースにしたオプションは無視されます。

出力ファイルを -o オプションで指定するなら、そのファイルはバックアップされたものになりますが、入力ファイルではありません。

バックアップファイルの名前に影響するオプションは、バックアップを作成するかどうかに影響しません。例えば、 --no-backup-if-mismatch オプションを指定するなら、バックアップが作成されないので、このセクションで記述されているオプションは何も影響しません。


---------- Footnotes ----------

(1) GNU patch のバージョン 2.5.4 のコーディングエラーで、常に ` ~' が使用されますが、次のリリースで修正されるはずです。

10.10 リジェクトされたファイル名

リジェクトファイル ( patch が適用する場所を見つけられなかったパッチを含んでいるファイル) に対する名前は、通常、出力ファイルに ` .rej' を付け加えたもの (または、` .rej' を使用したなら、バックアップファイル名が長過ぎるなら ` #') です。

代わりに、すべてのリジェクトされたファイル名を単一のファイルに置くように patch に伝えることができます。 -r REJECT-FILE または --reject-file=REJECT-FILE オプションは、リジェクトされたファイル名として REJECT-FILE を使用します。

10.11 `patch' からのメッセージと質問

patch は、特に入力のデコードで問題があるなら、様々なメッセージを生成するかもしれません。処理方法が分からないような状況で、 patch は通常、キーボードから更に情報を入力するように促します。キーボードからの入力を促さないようにしたり、メッセージ内のファイル名を引用符で囲む方法に効果を与えるために、メッセージを多くしたり少なくしたりするオプションがあります。

patch は、すべての hunk が正しく適用されたなら 0 の、hunk が適用できなかったなら 1 の、そして、より重要な問題があるなら 2 のステータスで終了します。ループでパッチの組を適用しているとき、部分的にパッチを当てたファイルにそれ以降のパッチを適用しないように、終了ステータスをチェックするべきです。

10.11.1 `patch' の冗長な制御

--verbose オプションを使用することで、 patch により多くのメッセージを生成させることができます。例えば、このオプションを与えたとき、メッセージ ` Hmm...' は、 patch がパッチファイルのテキストを読み込んで、テキストにパッチがあるかどうかの決定を試み、存在するなら、パッチの種類が何かの決定を試みていることを示します。

-s, --quiet または --silent オプションを使用することで、エラーが発生しない限り、 patch からの端末へのすべての出力を抑制することができます。

10.11.2 キーボード入力の抑制

patch が尋ねることを避ける方法は 2 つあります。 -f または --force オプションは、行なっていることが分かっていることを仮定します。それで patch は次のことを行ないます:

*
ヘッダにファイル名が含まれていないパッチをスキップします。
*
パッチの ` Prereq:' 行に対する間違ったバージョンでさえファイルにパッチを当てます。
*
パッチがリバースパッチのように見えてもリバースパッチでないと仮定します。

-t または --batch オプションは、質問を抑制しますが、仮定は多少異なる点において、 -f に似ています。

*
ヘッダにファイル名が含まれていないパッチをスキップします ( -f と同じです)。
*
パッチの ` Prereq:' 行に対する間違ったバージョンのファイルにはパッチをスキップします。
*
パッチがリバースパッチのように見えるなら、リバースパッチと仮定します。

10.11.3 `patch' が引用符で囲む形式

patch が診断メッセージでファイル名を出力するとき、何通りかの方法で、名前を書式化できます。たとえ、句読点または改行のような特殊文字を含んでいても、明確にファイル名を出力するために役に立つはずです。 --quoting-style=WORD オプションは、名前の出力方法を制御します。 WORD は、次の 1 つとなるはずです:

` literal'
名前をそのまま出力します。
` shell'
名前にシェルのメタ文字または明確でない出力になるなら、シェルのために名前を引用符で囲みます。
` shell-always'
たとえ、名前が通常のもので引用符で囲む必要がなくても、シェルのために名前を引用符で囲みます。
` c'
C 言語の文字列のように、名前を引用符で囲みます。
` escape'
周りの二重引用符文字を削除することを除いて、` c' で囲みます。

--quoting-style オプションのデフォルト値を、環境変数 ` QUOTING_STYLE' で指定することができます。この環境変数が設定されていないなら、デフォルト値は shell' ですが、のデフォルト値は、 patch の将来のバージョンで変更されるかもしれません。

10.12 `patch' と POSIX の標準

--posix option オプションを指定するか、または ` POSIXLY_CORRECT' 環境変数を設定するなら、 patch は、次のように、厳密に POSIX の標準に従います:

*
差分のヘッダからファイル名を見るとき、リスト (古い、新しい、インデックス) から最初に存在するファイルを取ります。 "Multiple Patches"を参照してください。
*
差分によって削除されるファイルを削除しません。 "Creating と Removing"を参照してください。
*
RCS, ClearCase または SCCS からファイルを取得するかどうかを尋ねません。 "Revision Control"を参照してください。
*
コマンドラインで、すべてのオプションがファイルに先行されていることを要求します。
*
不一致があったとしても、ファイルをバックアップしません。 "Note Backups"を参照してください。

10.13 GNU `patch' と伝統的な `patch'

現在のバージョンの GNU patch は、通常 POSIX の標準に従います。この一般的な規則へのわずかな例外については、"patch と POSIX"を参照してください。

残念ながら POSIX では、いくつかの重要な方法で、 patch の動作を再定義しています。伝統的な patch または GNU patch のバージョン 2.1 とそれ以前を相互運用しなければならないなら、次下の違いを知っているべきです。

*
伝統的な patch では、 -p オプションのオペランドは省略可能で、 -p だけだと -p0 と同等です。現在 -p オプションはオペランドを要求し、 -p 0 は現在 -p0 と同等です。互換性を最大にするためには、 -p0-p1 のようなオプションを使用します。
 
また、伝統的な patch は、前に付けられたパスを取り除くとき、単純にスラッシュを数えます。 patch は現在、パス名の構成要素を数えます。すなわち、1 つ以上の隣接するスラッシュは、現在単一のスラッシュとして数えられます。互換性を最大にするためには、ファイル名に ` //' を含むパッチを送ることを避けます。
*
伝統的な patch は、デフォルトでバックアップができます。この振る舞いは現在、 -b または --backup オプションで利用可能です。
 
反対に、POSIX の patch POSIX のでは、バックアップは一致しないものがあるときでも決して作成されません。 GNU patch では、この振る舞いは --no-backup-if-mismatch オプション、または POSIX 準拠にすることで利用可能です。
 
伝統的な patch-b SUFFIX オプションは、 GNU patch-b -z SUFFIX オプションと同等です。
*
伝統的な patch は、パッチヘッダからパッチされるファイル名を直観するために、複雑な (そしてドキュメントが不完全な) 手法を使用していました。この手法は、POSIX に準拠しておらず、わずかの gotcha もあります。現在 patch はオプションで POSIX に準拠している、同じくらい複雑な (しかしドキュメントがより良い) 差分の手法を使用します。より gotcha が少ないことを期待しています。その 2 つの手法は、コンテクストを使用した差分のヘッダがファイル名と ` Index:' 行が前に付けられたものをはぎ取った後でもすべて同じであるなら、互換性があります。ヘッダのファイル名が同じ数のスラッシュを含んでいるなら、通常はパッチに互換性があります。
*
伝統的な patch はユーザに質問するとき、標準エラー出力に質問を送り、端末となっている次のリストの最初のファイルから答を探します: 標準エラー出力、標準出力、` /dev/tty' と標準入力です。現在 patch は、標準出力に質問を送り、答を ` /dev/tty' から受けとります。質問に対するデフォルトは、デフォルトの答えを使用するとき patch が無限ループにならないように変更されています。
*
伝統的な patch は、悪い hunk の数を数えたステータス値で終了するか、または本当に問題があったなら、ステータス 1 で終了していました。現在の patch は、hunk に失敗したものがあるなら、ステータス 1 で、本当に問題があったなら、ステータス 2 で終了します。
*
GNU patch、伝統的な patch または、POSIX 準拠の patch を実行している人に実行方法を説明するとき、次のオプションに制限してください。次のリストの空白は重要で、オペランドは必要です。


`-c'
`-d DIR'
`-D DEFINE'
`-e'
`-l'
`-n'
`-N'
`-o OUTFILE'
`-pNUM'
`-R'
`-r REJECTFILE'

 

11 パッチの作成と使用の助言

パッチを作成したり使用したりするときは、常識を働かせてください。例えば、プログラムのメンテナにバグフィックスを送るとき、すべての題目をカバーする分かりにくい 1 つの大きなパッチの代わりに、独立した題目ごとに 1 つの小さなパッチを複数送ってください。

ここに、ソフトウエアパッケージの更新でパッチを配布しようとしているなら、留意するべきいくつかのことがらを示します。

11.1 パッチを生成するための助言

パッケージの古いバージョンを新しいバージョンに変更するパッチを作成するために、最初に古いバージョンと新しいバージョンのコピーを隣接するサブディレクトリにコピーします。 2 つのバージョンを ` tar' アーカイブを展開することによって行うことが一般的です。

パッチを生成するために、コマンド ` diff -Naur OLD NEW' を使用します、ここで、OLD と NEW は、古いものと新しいディレクトリを識別しています。名前の OLD と NEW にスラッシュを含めるべきではありません。 -N オプションで、ファイルを作成したり削除するパッチになります。 -a で、テキストファイル以外を更新するパッチになります。 -u で、タイムスタンプと周りの文が十分に役に立つパッチを生成します。そして、 -r で、サブディレクトリを更新するパッチになります。ここに、Bourne シェルの構文を使用するコマンド例を示します:


diff -Naur gcc-3.0.3 gcc-3.0.4

受けとる人にパッチの適用方法を伝えます。これには使用する作業用ディレクトリと、使用する patch のオプションも含めるべきです。オプションとして -p1 がお勧めです。受け手のふりをして、オリジナルファイルのコピーにパッチを適用することによって手順をテストします。

パッチを生成するときの一般的な誤解を避ける方法については、 "Avoiding Common Mistakes"を参照してください。

11.2 パッチを使用するための助言

パッチの作成者は、受け手にパッチの適用方法を伝えているので、パッチの使用者の最初の経験則は、パッチで提供される指示に従うことです。

GNU diff では、任意の長い行を持つファイルと不完全な行で終るファイルを解析することができます。しかしながら、 patch の古いバージョンでは、そのようなファイルにパッチを当てることはできません。そのようなパッチの適用時に問題があるなら、最近のバージョンの GNU patch に更新してみてください。

11.3 一般的な誤解を避ける

複数のファイルのパッチを生成しているとき、 diff はスラッシュの無いディレクトリ名に適用します。こうすることで、このオプションは、古いものと新しいもののファイル名でスラッシュの数が異なるとき、予期しない結果になるので、パッチの利用者が -pNUMBER オプションを指定しているとき、混乱が少なくなります。例えば、次のようなヘッダを持つパッチを送らないでください:


diff -Naur v2.0.29/prog/README prog/README
--- v2.0.29/prog/README 2002-03-10 23:30:39.942229878 -0800
+++ prog/README 2002-03-17 20:49:32.442260588 -0800

その理由は、2 つのファイル名のスラッシュの数が異なっていて、異なるバージョンの patch では、ファイル名が異なっていると解釈するためです。混乱を避けるため、その代わりに次のような出力を送ってください:


diff -Naur v2.0.29/prog/README v2.0.30/prog/README
--- v2.0.29/prog/README 2002-03-10 23:30:39.942229878 -0800
+++ v2.0.30/prog/README 2002-03-17 20:49:32.442260588 -0800

コンテキストを使用した差分のヘッダまたは ` Index:' 行で、正しくファイル名を指定していることを確かめてください。既にパッチを当てたかどうか不思議に思うので、リバースパッチを送らないように注意してください。

` README.orig' または ` README~' のようなバックアップファイル名を比較することは、 patch が本当のファイルの代わりにバックアップファイルにパッチを当てようとして混乱しているので、そのようなパッチは、送ることを避けてください。代わりに、異なるディレクトリ、例えば ` old/README' と ` new/README' のように、同じベースのファイル名で比較したパッチを送ってください。

その前に行われるべきであった、他のパッチの前にパッチを部分的に適用する人を救うために、パッチファイルの最初のパッチに、パッチレベルやバージョン番号が含まれている ` patchlevel.h' または ` version.c のような名前でファイルを更新させることができます。入力ファイルに間違ったバージョン番号が含まれているなら、 patch は直ちにエラーを出します。

この問題を避けるさらに明確な方法は、パッチの前に ` Prereq:' 行を置くことです。パッチファイルに先導されるテキストに ` Prereq:' で始まる行が含まれているなら、 patch はその行の次の単語 (通常はバージョン番号) を取り、次の入力ファイルに空白類または改行が前後にある単語が含まれているかどうかチェックします。そうでないなら、 patch は処理する前に確認するためのプロンプトを出します。これで間違った順序でパッチを偶然に適用することが難しくなります。

11.4 より小さいパッチを生成する

パッチを生成する最も単純な方法は ` diff -Naur を使用することですが ("Tips for Patch Producers"参照)、パッチを作成する前にファイルの名前を変更したり削除したりすることで、パッチのサイズを小さくすることができるかもしれません。古いバージョンのパッケージに新しいバージョンにはないファイルが含まれているなら、または、ファイルが 2 つのバージョン間で名前が変更されているなら、パッチを適用する前に、古いバージョンのディレクトリでユーザが実行する ` rm' と ` mv' コマンドのリストを作成してください。次に、これらのコマンドをスクラッチ (走り書き) ディレクトリで実行します。

他のファイルから容易に再構築できるので (例えば、` TAGS' と ` yacc' と ` makeinfo' からの出力)、パッチを含める必要がないファイルがあるなら、 diff-x PATTERN オプション ("Comparing Directories"参照) で得られるパッチを実行してください。パッチ利用者が構築するツールがないため、パッチで派生しているファイルを変更して欲しいなら、パッチ利用者のタイムスタンプが make を混乱させないように、派生しているファイルのためのパッチがそれに依存するファイルのためにパッチを続けることをよく確かめてください。

いま、` diff -Naur' を使用してパッチを作成することができます。スクラッチディレクトリを最初に、新しいディレクトリを 2 番目に指定していることを確かめてください。

パッチを適用する前に、` rm' と ` mv' コマンドを実行するようにユーザに伝えるメモをパッチの先頭に追加してください。そして、スクラッチディレクトリを削除できます。

周りの文の使用をより小さくすることでパッチのサイズを小さくすることもできますが、パッチが入力ファイルに正確にマッチしないとき、適切な操作のために patch は通常、すくなくとも 2 行必要だということを覚えておいてください。

 

12 `cmp' の呼び出し

cmp コマンドは 2 つのファイルを比較し、異なっているなら、それらがどこで異なるかを最初のバイトと行番号で伝えるか、または 1 つのファイルがもう片方の前に追加されていることを報告します。バイトと行は、1 から始まります。 cmp の引数は次の通りです:


cmp OPTIONS... FROM-FILE [TO-FILE [FROM-SKIP [TO-SKIP]]]

ファイル名 ` -' は、常に標準入力です。 cmp は、1 つのファイル名が省略されている場合も標準入力を使用します。 FROM-SKIP と TO-SKIP オペランドは、それぞれのファイルの最初で無視するバイト数を指定します。それらは、 --ignore-initial=FROM-SKIP:TO-SKIP オプションと同等です。

デフォルトで、2 つのファイルに同じ無いようがあるなら、 cmp は何も出力しません。 1 つのファイルがもう片方の前に付けられているなら、 cmp は標準エラーに次の形式のメッセージを印刷 (表示) します:


cmp: EOF on SHORTER-FILE

そうでなければ、 cmp は標準出力に次の形式のメッセージを印刷 (表示) します:


FROM-FILE TO-FILE differ: char BYTE-NUMBER, line LINE-NUMBER

メッセージ形式は POSIX ロケールの外側で異なるかもしれません。また、 POSIX では、EOF メッセージの後に空白と何らかの追加情報を続けることができます。

0 の終了ステータスは、差異が見つからないこと、1 は差異が見つかったこと、そして 2 は問題が生じたことを意味します。

12.1 `cmp' のオプション

以下は、GNU cmp が受け付けるすべてのオプションの概要です。ほとんどのオプションには 2 つの同等な名前があり、1 つは ` -' が前に付く単一文字で、もう 1 つは ` --' が前に付く長い名前です。複数の (引数を取らないなら) 単一文字のオプションを、単一のコマンドラインの単語と組み合わせることができます: -bl-b -l と同等です。

-b
 
--print-bytes
差異のあるバイトを印刷 (出力) します。制御バイトは ` ^' にアルファベットの文字を続けて表示し、上位ビットが設定されているバイトは ("meta" (メタ) を意味する) ` M-' を前に付けます。
--help
使用法の概要を出力して、終了します。
-i SKIP
 
--ignore-initial=SKIP
入力ファイルの最初の SKIP バイトにある差異を無視します。 SKIP バイトより小さいファイルは、空のファイルとして扱います。 SKIP が形式 ` FROM-SKIP:TO-SKIP' であるなら、最初の入力ファイルの最初の FROM-SKIP バイトと、2 番目の最初の TO-SKIP バイトをスキップします。
-l
 
--verbose
デフォルトの標準出力の代わりに、すべての異なったバイトの (10進数) バイト数と (8進数) 値を出力します。
-n COUNT
 
--bytes=COUNT
入力バイトの最大 COUNT を比較します。
-s
 
--quiet
 
--silent
何も印刷 (出力) しません。ファイルが異なっているかどうかを示す終了ステータスのみ返します。
-v
 
--version
バージョン情報を出力して、終了します。

上記の表では、バイトカウントのオペランドは、通常 10 進数ですが、8 進数に対しては ` 0' を、16 進数に対しては ` 0x' を前に付けることができます。

そのカウントの倍数を指定するために、接尾辞をバイトカウントのあとに続けることができます。この場合、省略された整数は 1 として解釈されます。サイズのみを示す文字、または ` iB' が続くものは、1024 の冪乗を使用して倍数を指定します。代わりに、` B' が続くサイズを示す文字は、1000 倍を指定します。例えば、 -n 4M-n 4MiB は `-n 4194304' と同等ですが、 -n 4MB-n 4000000 と同等です。この表記法は、10 進数の倍数のための SI 接頭辞 (http://www.bipm.fr/enus/3_SI/si-prefixes.html) とバイナリの倍数のための IEC 60027-2 接頭辞 (http://physics.nist.gov/cuu/Units/binary.html) と上位互換性です。

次の接尾辞が定義されています。 ` 1Y' のような大きいサイズは、計算の制限のためにコンピュータによっては拒絶されるかもしれません。

` kB'
キロバイト: 10^3 = 1000。
` k'
 
` K'
 
` KiB'
キビバイト (kibibyte): 2^10 = 1024。 ` K' は特殊です。 SI 接頭辞は ` k' で、IEC 60027-2 接頭辞は、 ` Ki' ですが、伝統的なものと POSIX は、` k' を ` KiB' の意味で使用します。
` MB'
メガバイト: 10^6 = 1,000,000。
` M'
 
` MiB'
メビバイト (mebibyte): 2^20 = 1,048,576。
` GB'
ギガバイト: 10^9 = 1,000,000,000。
` G'
 
` GiB'
ギビバイト (gibibyte): 2^30 = 1,073,741,824。
` TB'
テラバイト: 10^12 = 1,000,000,000,000。
` T'
 
` TiB'
テビバイト (tebibyte): 2^40 = 1,099,511,627,776。
` PB'
ペタバイト (petabyte): 10^15 = 1,000,000,000,000,000。
` P'
 
` PiB'
ペビバイト (pebibyte): 2^50 = 1,125,899,906,842,624。
` EB'
エクサバイト (exabyte): 10^18 = 1,000,000,000,000,000,000。
` E'
 
` EiB'
エクシビバイト (exbibyte): 2^60 = 1,152,921,504,606,846,976。
` ZB'
ゼータバイト (zettabyte): 10^21 = 1,000,000,000,000,000,000,000。
` Z'
 
` ZiB'
2^70 = 1,180,591,620,717,411,303,424。 (` Zi' は IEC 60027-2 の GNU 拡張です。)
` YB'
ヨットバイト (yottabyte): 10^24 = 1,000,000,000,000,000,000,000,000。
` Y'
 
` YiB'
2^80 = 1,208,925,819,614,629,174,706,176。 (` Yi' は IEC 60027-2 の GNU 拡張です。)
 

13 `diff' の呼び出し

diff コマンドの実行形式は、次の通りです:


diff OPTIONS... FILES...

最も単純な場合、2 つのファイル名 FROM-FILE と TO-FILE が与えられ、 diff は FROM-FILE と TO-FILE の内容を比較します。ファイル名 ` - は、標準入力から読み込まれたテキストを意味します。特別な場合として、` diff --' は、標準入力のコピーと標準入力自体を比較します。

1 つのファイルがディレクトリで、もう一方はディレクトリではないなら、 diff はディレクトリではないファイルの名前をもつディレクトリ内のファイルと比較します。ディレクトリではないファイルを、` -' にしてはいけません。

2 つのファイル名が与えられ両方ともディレクトリであるなら、 diff は両方のディレクトリの対応するファイルを、アルファベット順に比較します。この比較は、 -r または --recursive オプションが与えられていないなら、再帰的ではありません。 diff は、ディレクトリの実際の内容をファイルであるかのように比較しません。標準入力には名前が無く "file with the same name" (同じ名前のファイル) という概念が適用できないので、完全に指定されているファイルを標準入力にしてはいけません。

--from-file=FILE オプションが与えられているなら、ファイル名の数は任意で、FILE は、それぞれ指定されたファイルで比較されます。同様に、 --to-file=FILE オプションが与えられているなら、それぞれ指定されたファイルが、FILE と比較されます。

diff のオプションは ` -' で始まっているので、通常のファイル名は ` -' で始まることができません。しかしながら、引数として ` --' 自体を与えることで、残りの引数が - で始まったとしても、それをファイル名として扱います。

0 の終了ステータスは、差異が見つからないことを意味し、1 は、差異が見つかったことを意味し、そして 2 は問題があったことを意味します。通常、バイナリファイルの差異は、問題とみなしますが、 -a--text オプション、または -q--brief オプションを使用することによって、これを変更することができます。

13.1 `diff' のオプション

以下は、GNU diff が受け付けるすべてのオプションの概要です。ほとんどのオプションには 2 つの同等な名前があり、1 つは ` -' が前に付く単一文字で、もう 1 つは ` --' が前に付く長い名前です。複数の (引数を取らないなら) 単一文字のオプションを、単一のコマンドラインの単語と組み合わせることができます: -ac-a -c と同等です。それらの名前のユニークな接頭辞で、長い名前のオプションを簡略化することができます。カッコ ([ と ]) は、省略可能な引数を取るオプションを示します。

-a
 
--text
ファイルがテキストのようではなくても、すべてのファイルは、テキストとして扱い、行単位で比較します。 "Binary"を参照してください。
-b
 
--ignore-space-change
空白類の量による変更を無視します。 "White Space"を参照してください。
-B
 
--ignore-blank-lines
空白行の挿入や削除のみの変更を無視します。 "Blank Lines"を参照してください。
--binary
バイナリモードでデータを読み書きします。 "Binary"を参照してください。
-c
周りの 3 行を表示しながら、周りの文を使用した出力書式を使用します。 "Context Format"を参照してください。
-C LINES
 
--context[=LINES]
周りの LINES (整数) 行、または LINES が与えられていないなら、 3 行を表示して、周りの文を使用した出力書式を使用します。 "Context Format"を参照してください。適切に処理するため、 patch は、通常少なくとも周りの 2 行が必要です。
 
古いシステムでは、 diff は、 -c または -p と組み合わせたとき効果がある時代遅れの -LINES をサポートしています。 POSIX 1003.1-2001 ("Standards conformance"参照) では、これを許可していません。代わりに -C LINES を使用してください。
--changed-group-format=FORMAT
if-then-else 書式で、両方のファイルの異なっている部分の行グループを出力するために FORMAT を使用します。 "Line Group Formats"を参照してください。
-d
 
--minimal
変更の組がより小さくなるように探すアルゴリズムに変更します。これは diff をより遅く (時には非常に遅く) します。 "diff Performance"を参照してください。
-D NAME
 
--ifdef=NAME
マクロ NAME のプリプロセッサの条件式となる、マージされた ` #ifdef' 書式の出力を行います。 "If-then-else"を参照してください。
-e
 
--ed
有効な ed スクリプトとなる出力を行います。 "ed Scripts"を参照してください。
-E
 
--ignore-tab-expansion
タブの展開による変更を無視します。 "White Space"を参照してください。
-f
 
--forward-ed
ed スクリプトのように見える出力を行いますが、ファイルに現れる順序は変更されます。 "Forward ed"を参照してください。
-F REGEXP
 
--show-function-line=REGEXP
コンテキストを使用する、または一体化した (unified) 書式で、それぞれの差異の hunk に対し、REGEXP にマッチしたいくつかの先行する最後の行を表示します。 "Specified Headings"を参照してください。
--from-file=FILE
FILEをそれぞれのオペランドと比較します。 FILE はディレクトリでもかまいません。
--help
使用法の概要を出力して、終了します。
--horizon-lines=LINES
共通の前に付けられた部分の最後の LINES と共通の後に付けられた部分の最初の LINES を削除しません。 "diff Performance"を参照してください。
-i
 
--ignore-case
大文字小文字の変更を無視します。大文字と小文字は同等であると見なします。 "Case Folding"を参照してください。
-I REGEXP
 
--ignore-matching-lines=REGEXP
REGEXP にマッチする行の挿入と削除だけの変更を無視します。 "Specified Lines"を参照してください。
--ignore-file-name-case
再帰的な比較でファイル名を比較しているとき、大文字小文字を無視します。 "Comparing Directories"を参照してください。
-l
 
--paginate
ページ付けするために出力を pr に渡します。 "Pagination"を参照してください。
--label=LABEL
コンテキストを使用した書式 ("Context Format"参照) と一体化した (unified) 書式 ("Unified Format"参照) のヘッダで、ファイル名の代わりに LABEL を使用します。 "RCS"を参照してください。
--left-column
横に並べた書式で、2 つに共通な行の左の列だけを印刷 (出力) します。 "Side by Side Format"を参照してください。
--line-format=FORMAT
if-then-else 書式で、すべての入力行を出力するために FORMAT を使用します。 "Line Formats"を参照してください。
-n
 
--rcs
RCS 書式の差分を出力します。それぞれのコマンドが作用する行番号を指定することを除いて、 -f に似ています。 "RCS"を参照してください。
-N
 
--new-file
ディレクトリの比較で、ファイルが一方のディレクトリだけで見つかっても、もう一方には空のものが存在しているかのように扱います。 "Comparing Directories"を参照してください。
--new-group-format=FORMAT
if-then-else 書式で、2 番目のファイルから取られる行のグループを出力するために、FORMAT を使用します。 "Line Group Formats"を参照してください。
--new-line-format=FORMAT
if-then-else 書式で、2 番目のファイルから取られる行を出力するために、 FORMAT を使用します。 "Line Formats"を参照してください。
--old-group-format=FORMAT
if-then-else 書式で、最初のファイルから取られる行のグループを出力するために、FORMAT を使用します。 "Line Group Formats"を参照してください。
--old-line-format=FORMAT
if-then-else 書式で、最初のファイルから取られる行を出力するために、FORMAT を使用します。 "Line Formats"を参照してください。
-p
 
--show-c-function
変更があったそれぞれの C 関数を表示します。 "C Function Headings"を参照してください。
-q
 
--brief
ファイルに差異があるかどうかを報告するだけで、差異を詳述しません。 "Brief"を参照してください。
-r
 
--recursive
ディレクトリの比較時に、見つかったすべてのサブディレクトリを再帰的に比較します。 "Comparing Directories"を参照してください。
-s
 
--report-identical-files
2 つのファイルが同じとき報告します。 "Comparing Directories"を参照してください。
-S FILE
 
--starting-file=FILE
ディレクトリの比較時に、ファイル FILE から開始します。これは、中止された比較を再開するために使用されます。 "Comparing Directories"を参照してください。
--speed-large-files
小さな変更が大量にある大きなファイルの処理を高速化するため、発見的手法を使用します。 "diff Performance"を参照してください。
--strip-trailing-cr
入力行の終りの後続するすべてのキャリッジリターンを取り除きます。 "Binary"を参照してください。
--suppress-common-lines
横に並べた書式で、共通の行を印刷 (出力) しません。 "Side by Side Format"を参照してください。
-t
 
--expand-tabs
入力ファイルのタブによる整列を保持するために、出力のタブを空白に展開します。 "Tabs"を参照してください。
-T
 
--initial-tab
通常またはコンテキストを使用する書式で、行のテキストの前に空白ではなくタブを出力します。これで行のタブでの整列が通常通りに見えます。 "Tabs"を参照してください。
--tabsize=COLUMNS
タブストップが COLUMNS (デフォルトは 8) 印刷カラム毎に設定されると仮定します。 "Tabs"を参照してください。
--to-file=FILE
それぞれのオペランドを FILE と比較します。 FILE はディレクトリでもかまいません。
-u
周りの文を 3 行表示する、一体化した (unified) 出力書式を使用します。 "Unified Format"を参照してください。
--unchanged-group-format=FORMAT
if-then-else 書式で、両方のファイルから取られる共通の行のグループを出力するために、FORMAT を使用します。 "Line Group Formats"を参照してください。
--unchanged-line-format=FORMAT
if-then-else 書式で、両方のファイルに共通な行を出力するために、 FORMAT を使用します。 "Line Formats"を参照してください。
--unidirectional-new-file
ディレクトリを比較するとき、2 つのうち 2 番目のディレクトリだけにファイルがあるなら、もう一方に空のファイルが存在しているかのように扱います。 "Comparing Directories"を参照してください。
-U LINES
 
--unified[=LINES]
周りの LINES (整数) 行、または LINES が与えられていないなら、 3 行を表示して、一体化した (unified) 出力書式を使用します。 "Unified Format"を参照してください。適切に処理するため、 patch は、通常少なくとも周りの 2 行が必要です。
 
古いシステムでは、 diff は、 -u と組み合わせたとき効果がある時代遅れのオプション -LINES をサポートしています。 POSIX 1003.1-2001 ("Standards conformance"参照) では、これを許可していません。代わりに -U LINES を使用してください。
-v
 
--version
バージョン情報を出力して、終了します。
-w
 
--ignore-all-space
行を比較するとき、空白類を無視します。 "White Space"を参照してください。
-W COLUMNS
 
--width=COLUMNS
横に並べた書式で、行ごとに最大 COLUMNS (デフォルトは 130) 印刷列を出力します。 "Side by Side Format"を参照してください。
-x PATTERN
 
--exclude=PATTERN
ディレクトリを比較するとき、ベース名が PATTERN にマッチするファイルとサブディレクトリを無視します。 "Comparing Directories"を参照してください。
-X FILE
 
--exclude-from=FILE
ディレクトリを比較するとき、ベース名が FILE に含まれているパターンにマッチするファイルとサブディレクトリを無視します。 "Comparing Directories"を参照してください。
-y
 
--side-by-side
横に並べた書式を使用します。 "Side by Side Format"を参照してください。
 

14 `diff3' の呼び出し

diff3 コマンドは 3 つのファイルを比較し、それらの差異の記述を出力します。その引数は次の通りです。


diff3 OPTIONS... MINE OLDER YOURS

比較するファイルは、MINE, OLDER と YOURS です。これらの 3 つのファイルの 1 つは ` -' を指定でき、それは diff3 にファイルを標準入力から読み込むように伝えます。

0 の終了ステータスは diff3 が成功したことを意味し、1 は衝突が見つかったことを意味し、2 は問題があったことを意味します。

14.1 `diff3' のオプション

以下は、GNU diff3 が受け付けるすべてのオプションの概要です。複数の (引数を取らないなら) 単一文字のオプションを、単一のコマンドラインの単語と組み合わせることができます。

-a
 
--text
ファイルがテキストのようではなくても、すべてのファイルは、テキストとして扱い、行単位で比較します。 "Binary"を参照してください。
-A
 
--show-all
OLDER から YOURS へのマージされていないすべての変更を、衝突した部分の周りをカッコ付の行で囲んで MINE に取り込みます。 "Marking Conflicts"を参照してください。
--diff-program=PROGRAM
diff の代わりに、ファイルを比較する互換性のある比較プログラム PROGRAM を使用します。
-e
 
--ed
OLDER から YOURS へのすべての変更を MINE に取り込む ed スクリプトを生成します。 "Which Changes"を参照してください。
-E
 
--show-overlap
オーバラップしている変更部分の最初と 3 番目のファイルの行をカッコで囲むことを除いて、 -e に似ています。 "Marking Conflicts"を参照してください。 -E を用いると、オーバラップしている変更は次のようになります:
 

<<<<<<< MINE
lines from MINE
=======
lines from YOURS
>>>>>>> YOURS
--help
使用法の概要を出力して、終了します。
-i
System V 互換のため、 ed スクリプトの終りに ` w' と ` q' コマンドを生成します。このオプションは、 -AeExX3 オプションの 1 つと組み合わせなければなりません、そして -m と組み合わせてはいけません。 "Saving the Changed File"を参照してください。
--label=LABEL
-A, -E-X オプションで出力されるカッコに対して、ラベル LABEL を使用します。このオプションはそれぞれの入力ファイルに対して 1 つ、最大 3 回まで与えることができます。デフォルトのラベルは入力ファイルの名前です。従って、` diff3 --label X --label Y --label Z -m A B C' は、出力が、ファイル名 ` A', ` B' と ` C' からではなく、ファイル名 ` X', ` Y' と ` Z' からのように見えることを除いて、 ` diff3 -m A B C' ように振る舞います。 "Marking Conflicts"を参照してください。
-m
 
--merge
最初のファイルに編集スクリプトを適用し、結果を標準出力に送ります。 diff3 の出力を ed にパイプで送るのとは異なり、これはバイナリファイルや不完全なファイルに対しても動作します。編集スクリプトのオプションが指定されていないなら、 -A が仮定されます。 "Bypassing ed"を参照してください。
--strip-trailing-cr
入力行の終りの後続するすべてのキャリッジリターンを取り除きます。 "Binary"を参照してください。
-T
 
--initial-tab
通常の書式の行のテキストの前に、2 つの空白の代わりにタブを出力します。これで、行中のタブによる整列が普通になります。 "Tabs"を参照してください。
-v
 
--version
バージョン情報を出力して、終了します。
-x
 
--overlap-only
オーバラップしている変更だけ出力することを除いて、 -e に似ています。 "Which Changes"を参照してください。
-X
オーバラップしている変更だけ出力することを除いて、 -E に似ています。言い替えると、 -E のようにカッコを変更することを除いて、 -x に似ています。 "Marking Conflicts"を参照してください。
-3
 
--easy-only
オーバラップしていない変更だけ出力することを除いて、 -e に似ています。 "Which Changes"を参照してください。
 

15 `patch' の呼び出し

通常 patch は次ののように呼び出されます:


patch <PATCHFILE

patch を呼び出す完全な書式は次の通りです:


patch OPTIONS... [ORIGFILE [PATCHFILE]]

`-i PATCHFILE' または --input=PATCHFILE オプションで読み込むパッチを指定することもできます。 PATCHFILE を指定していないか、または PATCHFILE が - であるなら、 patch はパッチを標準入力からパッチ (すなわち diff の出力) を読み込みます。

コマンドラインで入力ファイルを指定していないなら、 patch は、"leading text" (先導するテキスト) ( diff の出力の前に現れるパッチ内のテキスト) から編集するファイルを見つけようとします。 "Multiple Patches"を参照してください。

デフォルトで、 patch はオリジナルの入力ファイルをパッチを当てたバージョンに置換し、オリジナルファイルをバックアップファイルに名前を変えます ( patch がバックアップファイルに名前を付ける方法の説明については、 "Backup Names"参照)。 -o FILE または --output=FILE オプションで出力を置く場所を指定することもできます。しかしながら、FILE が入力ファイルの 1 つであるなら、このオプションを使用しないでください。

15.1 `patch' のオプション

以下は、GNU patch が受け付けるすべてのオプションの概要です。これらのオプションを patch の古いバージョンで安全に使用するためには、 "patch と Tradition"を参照してください。

複数の引数を取らない単一文字のオプションを、1 つのダッシュを用いて単一のコマンドラインに組み合わせることができます。

-b
 
--backup
バックアップが通常作成されなくても、それぞれのファイルのオリジナルの内容をバックアップします。 "Backups"を参照してください。
-B PREFIX
 
--prefix=PREFIX
バックアップファイル名に PREFIX を前に付けます。 "Backup Names"を参照してください。
--backup-if-mismatch
パッチがファイルに正確にマッチしないなら、それぞれのファイルのオリジナルの内容をバックアップします。これは、POSIX 準拠していないときのデフォルトの振る舞いです。 "Backups"を参照してください。
--binary
標準出力と ` /dev/tty' を除いて、すべてのファイルをバイナリモードで読み書きします。このオプションは、GNU/Linux のような POSIX 準拠のシステムでは効果がありません。このオプションで差異を作成するシステムでは、パッチを ` diff -a --binary' で生成するべきです。 "Binary"を参照してください。
-c
 
--context
パッチファイルをコンテキストを使用している差分として解釈します。 "patch Input"を参照してください。
-d DIRECTORY
 
--directory=DIRECTORY
パッチファイルのファイル名と、それ以外のオプションの引数として与えられるファイルの両方を解釈するため、ディレクトリ DIRECTORY をカレントディレクトリにします。 "patch Directories"を参照してください。
-D NAME
 
--ifdef=NAME
NAME を使用して if-then-else の出力をマージします。 "If-then-else"を参照してください。
--dry-run
実際にファイルを変更せずに、パッチを適用した結果を印刷 (出力) します。 "Dry Runs"を参照してください。
-e
 
--ed
パッチファイルを ed スクリプトとして解釈します。 "patch Input"を参照してください。
-E
 
--remove-empty-files
パッチを適用した後に、空の出力ファイルを削除します。 "Creating と Removing"を参照してください。
-f
 
--force
ユーザが自分が行なっていることを正確に知っていると仮定し、質問しません。 "patch Messages"を参照してください。
-F LINES
 
--fuzz=LINES
最大の fuzz 要素を LINES に設定します。 "Inexact"を参照してください。
-g NUM
 
--get=NUM
NUM が正であるなら、必要があればリビジョンコントロールシステムから入力ファイルを取得します。 0 であるなら、ファイルを取得しません。負であるなら、ユーザにファイルを取得するかどうか尋ねます。 "Revision Control"を参照してください。
--help
使用法の概要を出力して、終了します。
-i PATCHFILE
 
--input=PATCHFILE
パッチを標準入力からではなく PATCHFILE から読み込みます。 "patch Options"を参照してください。
-l
 
--ignore-white-space
パッチファイルの連続した空白 (空白とタブ) を、入力ファイルの連続した空白にマッチさせます。 "Changed White Space"を参照してください。
-n
 
--normal
パッチファイルを通常の差分として解釈します。 "patch Input"を参照してください。
-N
 
--forward
patch がリバースパッチまたは既に適用していると考えられるパッチを無視します。 -R も参照してください。 "Reversed Patches"を参照してください。
--no-backup-if-mismatch
ファイルのオリジナルの内容をバックアップしません。これは、POSIX に準拠ときのデフォルトの振る舞いです。 "Backups"を参照してください。
-o FILE
 
--output=FILE
出力ファイル名として FILE を使用します。 "patch Options"を参照してください。
-pNUMBER
 
--strip=NUMBER
ファイル名のストリップ数を NUMBER に指定します。 "patch Directories"を参照してください。
--posix
` POSIXLY_CORRECT' 環境変数が設定されているかのように、 POSIX に準拠します。 "patch と POSIX"を参照してください。
--quoting-style=WORD
` QUOTING_STYLE' 環境変数が WORD に設定されているかのように、診断時の名前を引用符で囲む WORD 形式を使用します。 "patch Quoting Style"を参照してください。
-r REJECT-FILE
 
--reject-file=REJECT-FILE
リジェクトファイル名として REJECT-FILE を使用します。 "Reject Names"を参照してください。
-R
 
--reverse
このパッチが古いファイルと新しいファイルを交換するように作成されたと仮定します。 "Reversed Patches"を参照してください。
-s
 
--quiet
 
--silent
エラーが生じない限り、静かに動作します。 "patch Messages"を参照してください。
-t
 
--batch
何も質問してきません。 "patch Messages"を参照してください。
-T
 
--set-time
パッチファイルの更新時間とアクセス時間を、コンテキスト文を使用した差分のヘッダがローカル時間を使用していると仮定して、コンテキストを使用した差分のヘッダで与えられたタイムスタンプに設定します。 "Patching Time Stamps"を参照してください。
-u
 
--unified
パッチファイルを一体化した (unified) 差分として解釈します。 "patch Input"を参照してください。
-v
 
--version
バージョン情報を出力して、終了します。
-V BACKUP-STYLE
 
--version=control=BACKUP-STYLE
バックアップファイル名の名前の変換方法を選択します。 "Backup Names"を参照してください。
--verbose
通常より多くの診断メッセージを印刷 (出力) します。 "patch Messages"を参照してください。
-x NUMBER
 
--debug=NUMBER
内部のデバッグフラグを設定します。 patch を変更する人にだけに意味があります。
-Y PREFIX
 
--basename-prefix=PREFIX
バックアップファイルのベース名に PREFIX を前に付けます。 "Backup Names"を参照してください。
-z SUFFIX
 
--suffix=SUFFIX
バックアップの拡張子として、` .orig' または ` ~' の代わりに SUFFIX を使用します。 "Backup Names"を参照してください。
-Z
 
--set-utc
パッチファイルの更新時間とアクセス時間を、コンテキストを使用した差分のヘッダが UTC を使用していると仮定して、コンテキストを使用した差分のヘッダで与えられたタイムスタンプに設定します。 "Patching Time Stamps"を参照してください。
 

16 `sdiff' の呼び出し

sdiff コマンドは、2 つのファイルをマージし、その結果を対話的に出力します。その引数は次の通りです:


sdiff -o OUTFILE OPTIONS... FROM-FILE TO-FILE

これは、FROM-FILE と TO-FILE をマージし、OUTFILE に出力します。 FROM-FILE がディレクトリであり、TO-FILE がそうでないなら、 sdiff はファイル名が TO-FILE のものである FROM-FILE のファイルを比較します、逆もまた同様です。 FROM-FILE と TO-FILE を両方ともディレクトリにすることはできません。

sdiff のオプションは ` -' で始まるので、通常 FROM-FILE と TO-FILE を ` -' で始めることはできません。しかしながら、引数として ` --' 自体を与えることで、残りの引数が - で始まったとしても、それをファイル名として扱います。 ` -' を入力ファイルとして使用してはいけません。

-o (または --output) を用いない sdiff は、横に並べた差異を生成します。この使用法は時代遅れです。代わりに diff-y または --side-by-side オプションを使用します。

0 の終了ステータスは差異が見つからなかったことを意味し、1 は差異が見つかったことを意味し、そして 2 は問題が生じたことを意味します。

16.1 `sdiff'のオプション

以下は、GNU sdiff が受け付けるオプションすべての概要です。ぞれぞれのオプションには 2 つの同等な名前があり、1 つは ` -' が前に付く単一文字で、もう 1 つは ` --' が前に付く長い名前です。 (引数を取らないなら) 複数の単一文字のオプションを、単一のコマンドラインの引数に組み合わせることができます。長い名前のオプションは、それらの名前のユニークな前方部分で省略できます。

-a
 
--text
ファイルがテキストのようではなくても、テキストとしてすべてのファイルを扱い、行単位で比較します。 "Binary"を参照してください。
-b
 
--ignore-space-change
空白類の量の変更を無視します。 "White Space"を参照してください。
-B
 
--ignore-blank-lines
空白行の挿入と削除だけの変更を無視します。 "Blank Lines"を参照してください。
-d
 
--minimal
より小さな変更の組を見つけるアルゴリズムに変更します。これは sdiff をより遅く (時には非常に遅く) します。 "diff Performance"を参照してください。
--diff-program=PROGRAM
diff の代わりに、ファイルを比較する互換性のある比較プログラム PROGRAM を使用します。
-E
 
--ignore-tab-expansion
タブの展開による変更を無視します。 "White Space"を参照してください。
--help
使用法の概要を出力して、終了します。
-i
 
--ignore-case
大文字小文字の変更を無視します。大文字と小文字が同じであると見なします。 "Case Folding"を参照してください。
-I REGEXP
 
--ignore-matching-lines=REGEXP
REGEXP にマッチする行の挿入または削除だけの変更を無視します。 "Specified Lines"を参照してください。
-l
 
--left-column
2 つの共通な行の左の列だけを印刷 (出力) します。 "Side by Side Format"を参照してください。
-o FILE
 
--output=FILE
マージされた出力を FILE に置きます。このオプションはマージのために必要です。
-s
 
--suppress-common-lines
共通の行を印刷 (出力) しません。 "Side by Side Format"を参照してください。
--speed-large-files
小さな変更が大量にある大きなファイルの処理を高速化するため、発見的手法を使用します。 "diff Performance"を参照してください。
--strip-trailing-cr
入力行の終りの後続するすべてのキャリッジリターンを取り除きます。 "Binary"を参照してください。
-t
 
--expand-tabs
入力ファイルのタブの整列を保持するため、出力のタブを空白に展開します。 "Tabs"を参照してください。
--tabsize=COLUMNS
タブストップが COLUMNS (デフォルトは 8) 印刷カラム毎に設定されると仮定します。 "Tabs"を参照してください。
-v
 
--version
バージョン情報を出力して、終了します。
-w COLUMNS
 
--width=COLUMNS
行ごとに最大 COLUMNS (デフォルトは 130) 印刷列を出力します。 "Side by Side Format"を参照してください。歴史的な理由から、このオプションは diff では -W に、 sdiff では -w であることに注意してください。
-W
 
--ignore-all-space
行を比較するとき、空白類を無視します。 "White Space"を参照してください。歴史的な理由から、このオプションは diff では -w に、 sdiff では -W であることに注意してください。
 

17 標準への準拠

少数の例で、GNU ユーティリティのデフォルトの動作は POSIX の標準と互換性がありません。これらの非互換性を抑制するためには、` POSIXLY_CORRECT' 環境変数を定義してください。 POSIX 準拠をチェックしていないなら、 ` POSIXLY_CORRECT' を定義する必要はありません。

通常、オプションとオペランドは、任意の順序で現れることができ、プログラムはすべてのオプションがオペランドの前にあるかのように振る舞います。例えば、` 2' は -C のオプションの引数なので、 ` diff lao tzu -C 2' は ` diff -C 2 lao tzu' のように振る舞います。しかしながら、` POSIXLY_CORRECT' 環境変数が設定されているなら、それ以外のオプションが特定のコマンドに指定されていないなら、オプションはオペランドの前に現れなければなりません。

新しいバージョンの POSIX は、古いバージョンのものと時々互換性がないものがあります。例えば、古いバージョンの POSIX で、コマンド ` diff -c -10' は ` diff -C 10' と同じ意味がありますが、POSIX 1003.1-2001 の diff では、 -10 ような数字列のオプションを許可していません。

GNU のユーティリティは通常、システム標準の POSIX のバージョンに準拠しています。異なる POSIX のバージョンに準拠させるために、標準の年月を指定する YYYYMM の形式の値を適用するために ` _POSIX2_VERSION' 環境変数を定義します。現在、` _POSIX2_VERSION' に対して 2 つの値がサポートされています。 ` 199209' は POSIX 1003.2-1992 を意味し、 ` 200112' は POSIX 1003.1-2001 を意味します。例えば、古いバージョンの POSIX を仮定する古いソフトウェアを実行していて、` diff -c -10' を使用するなら、環境変数で ` _POSIX2_VERSION=199209' を設定することによって、互換性の問題を回避することができます。

 

18 将来のプロジェクト

ここで、GNU diffpatch を改良するためのいくつかの考えを示します。 GNU プロジェクトには、ボランティアのための潜在的なプログラミングプロジェクトとして、いくつかの改良点を認識しています。見つけたバグを報告することで、我々を助けることができます。

利用者がプログラマであって、GNU プロジェクトに何か貢献したいと思っているなら、これらのプロジェクトの 1 つのボランティアになることを考えてみてください。真面目に作業を考えているなら、他のボランティアと調整するため <gnu@gnu.org>にメールを送ってください。

18.1 GNU `diff' と `patch' を改良するためのプロジェクトへの提案

ディレクトリツリーの対からパッチを生成するために GNU diff を使用し、パッチとそのようなツリーの 1 つをコピーが与えられ、もう一方の信頼できるコピーを生成するために patch を使用できるようにするべきです。残念ながら、現在のパッチ書式を使用してディレクトリツリーの変更を表現することできません。また、 patch は、既存の書式のいくつかを取り扱いません。これらの欠点は、続く提案されているプロジェクトの動機付けをします。

18.1.1 マルチバイトと可変幅文字の処理

diff, diff3sdiff は、入力のそれぞれの行を (マルチバイトではなく) 単一バイト文字の文字列として扱います。これにより、場合によってはマルチバイト文字を誤って処理するかもしれません。例えば、空白を無視するように求められているとき、 diff はマルチバイトの空白文字を適切に無視しません。

また、 diff は現在、それぞれのバイトが 1 カラムの幅だと仮定していて、この仮定は、例えば、UTF-8 エンコーディングを使用するロケールのように、いくつかのロケールでは正しくありません。これによって、 diff-y または --side-by-side オプションで問題となります。

これらの問題は、単一バイト環境でのユーティリティの性能にあまり影響しないように修正する必要があります。

IBM GNU/Linux Technology Center Internationalization Team は、国際化された diff をサポートするパッチ (http://oss.software.ibm.com/developer/opensource/linux/patches/i18n/diffutils-2.7.2-i18n-0.1.patch.gz) を提案しています。残念ながら、これらのパッチは不完全で、 diff の古いバージョンへのものであるので、この分野でより多くの作業が必要です。

18.1.2 ディレクトリ構造の変更の処理

diffpatch は、ディレクトリ構造へのいくつかの変更に対処していません。例えば、1 つのディレクトリツリーには、補助的なファイルがある ` D という名前のディレクトリが含まれ、もう一方には同じ名前の ` D' というファイルが含まれていると仮定します。 ` diff -r' は、 patch がディレクトリのサブツリーをファイルに変換するための十分な情報を出力しません。

パッチファイルに全ての内容を含める必要がないように、削除されたファイルを指定する方法があるべきです。 diff がそのような情報を生成する方法がなくても、ファイルの名前が変更されたことを patch に伝える方法もあるべきです。ファイルの内容が変更されていなくても、ファイルのタイムスタンプが変更されていることを patch に伝える方法があるべきです。

これらの問題は、ディレクトリ構造の変更を表現する diff の出力書式を拡張し、これらの拡張を理解するよう patch を拡張することによって解決できます。

18.1.3 ディレクトリでも通常のファイルでもないファイル

ファイルには、ディレクトリでも通常のファイルでもないものがあります: それらは、シンボリックリンク、デバイスの特殊ファイル、名前付パイプとソケットのような通常ではないファイルです。現在、 diff は、再帰的な diff が、シンボリックリンクの無限ループ (例えば、` ..' へのシンボリックリンク) を検出するなら、エラーを報告することを除いて、まるでそれらがファイルを指しているかのようにシンボリックリンクを扱います。 diff は、他の特別なファイルがトップレベルで指定されるなら通常のファイルのようにそれらを扱いますが、ディレクトリを比較するときは、単にそれらの存在を報告します。これは、 patch がそのようなファイルへの変更を表現できないことを意味します。例えば、シンボリックリンクが指しているファイルを変更するなら、 diff は、シンボリックリンクへの変更の代わりに、2 つのファイルの差異を出力します。

diff は、オプションで特別に特殊ファイルの変更を報告するべきで、 patch はこれらの拡張を理解するように拡張すべきです。

18.1.4 通常ではない文字を含むファイル名

ファイル名に改行または空白のような通常ではない文字が含まれるとき、 ` diff -r' は、 patch が解析できないパッチを生成します。奇妙なファイル名によって、 diff は、構文的には正しいが間違ったファイルにパッチを当てるパッチを生成するので、 patch だけではなく、問題は、 diff の出力書式です。 diff の出力の書式は、可能性のあるすべてのファイル名を処理するように拡張されるべきです。

18.1.5 タイムスタンプの順に差分を出力する

複数ファイルの差分に patch を適用することは、ファイルのタイムスタンプが異常なファイルの結果となるかもしれません。 GNU patch には、更新されたファイルのタイムスタンプを復元するオプションがありますが ("Patching Time Stamps"参照)、受け取り人に、GNU patch がないか、またはこれらのオプションを使用しなくても、動作するパッチを生成することが役に立つこともあります。こうするための 1 つの方法は、出力する差分をタイムスタンプの順番にする diff のオプションを実装することです。

18.1.6 特定の変更を無視する

マッチしていると考えられる、FROM-FILE の 1 つと TO-FILE の 1 つの、 2 つの文字列を指定する機能があれば素晴らしいでしょう。従って、2 つの文字列が ` foo' と ` bar' で、2 つの行でファイル 1 では ` foo' でファイル 2 では ` bar' に対応する部分のみが差分となるなら、その行が同じものとして処理されるということです。

この機能を一般化させる方法や、どうすべきであるか、どのような構文が使用されるべきであるかは、明確ではありません。

部分的な置換は、比較する前に 1 つまたは両方のファイルでフィルタを通すことです。例えば次の通りです:


sed 's/foo/bar/g' file1 ⎪ diff - file2

しかしながら、この出力はフィルタを通したテキストでオリジナルのものではありません。

18.1.7 性能の向上

2 つの大きなディレクトリ構造を比較しているとき、元々は一方がもう一方からタイムスタンプを保持したまま (例えば、` cp -pR' を用いて) コピーされていれば、サイズが同じでタイムスタンプが同じ 2 つのファイルが同じ内容であると仮定することを diff に伝えるオプションがあるなら、性能が大幅に向上されるでしょう。 "diff Performance"を参照してください。

18.2 バグの報告

GNU cmp, diff, diff3 または sdiff にバグを見つけたと思うなら、 GNU utilities bug report mailing list (http://mail.gnu.org/mailman/listinfo/bug-gnu-utils) <bug-gnu-utils@gnu.org>に電子メールで報告してください。 GNU patch のバグの報告は <bug-patch@gnu.org>に送ってください。できるだけ問題を明確に説明し、 --version オプションの出力と、できればバグを生成する入力ファイルのサンプルを含めて送ってください。重要なバグを修正したなら、それも送ってください。パッチがあるなら、それも送ってください。パッチがディレクトリ ` ftp://alpha.gnu.org/gnu/diffutils/' で見つけることができる、最新のテストリリースに関連するなら、メンテナ (保守管理者) の作業が簡単になるかもしれません。

 

付録 A このマニュアルのコピーについて

A.1 GNU Free Documentation License

Version 1.2, November 2002

Copyright (C) 2000,2001,2002 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA

Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.

0. PREAMBLE

The purpose of this License is to make a manual, textbook, or other functional and useful document "free" in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others.

This License is a kind of "copyleft", which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software.

We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference.

1. APPLICABILITY AND DEFINITIONS

This License applies to any manual or other work, in any medium, that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. Such a notice grants a world-wide, royalty-free license, unlimited in duration, to use that work under the conditions stated herein. The "Document", below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as "you". You accept the license if you copy, modify or distribute the work in a way requiring permission under copyright law.

A "Modified Version" of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language.

A "Secondary Section" is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document's overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (Thus, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them.

The "Invariant Sections" are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. If a section does not fit the above definition of Secondary then it is not allowed to be designated as Invariant. The Document may contain zero Invariant Sections. If the Document does not identify any Invariant Sections then there are none.

The "Cover Texts" are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be at most 25 words.

A "Transparent" copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, that is suitable for revising the document straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup, or absence of markup, has been arranged to thwart or discourage subsequent modification by readers is not Transparent. An image format is not Transparent if used for any substantial amount of text. A copy that is not "Transparent" is called "Opaque".

Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML, PostScript or PDF designed for human modification. Examples of transparent image formats include PNG, XCF and JPG. Opaque formats include proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML, PostScript or PDF produced by some word processors for output purposes only.

The "Title Page" means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, "Title Page" means the text near the most prominent appearance of the work's title, preceding the beginning of the body of the text.

A section "Entitled XYZ" means a named subunit of the Document whose title either is precisely XYZ or contains XYZ in parentheses following text that translates XYZ in another language. (Here XYZ stands for a specific section name mentioned below, such as "Acknowledgements", "Dedications", "Endorsements", or "History".) To "Preserve the Title" of such a section when you modify the Document means that it remains a section "Entitled XYZ" according to this definition.

The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. These Warranty Disclaimers are considered to be included by reference in this License, but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License.

2. VERBATIM COPYING

You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3.

You may also lend copies, under the same conditions stated above, and you may publicly display copies.

3. COPYING IN QUANTITY

If you publish printed copies (or copies in media that commonly have printed covers) of the Document, numbering more than 100, and the Document's license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects.

If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages.

If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a computer-network location from which the general network-using public has access to download using public-standard network protocols a complete Transparent copy of the Document, free of added material. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public.

It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document.

4. MODIFICATIONS

You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version:

A.
Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission.
B.
List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has fewer than five), unless they release you from this requirement.
C.
State on the Title page the name of the publisher of the Modified Version, as the publisher.
D.
Preserve all the copyright notices of the Document.
E.
Add an appropriate copyright notice for your modifications adjacent to the other copyright notices.
F.
Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below.
G.
Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document's license notice.
H.
Include an unaltered copy of this License.
I.
Preserve the section Entitled "History", Preserve its Title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section Entitled "History" in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence.
J.
Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the "History" section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission.
K.
For any section Entitled "Acknowledgements" or "Dedications", Preserve the Title of the section, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein.
L.
Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles.
M.
Delete any section Entitled "Endorsements". Such a section may not be included in the Modified Version.
N.
Do not retitle any existing section to be Entitled "Endorsements" or to conflict in title with any Invariant Section.
O.
Preserve any Warranty Disclaimers.

If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version's license notice. These titles must be distinct from any other section titles.

You may add a section Entitled "Endorsements", provided it contains nothing but endorsements of your Modified Version by various parties--for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard.

You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one.

The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version.

5. COMBINING DOCUMENTS

You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice, and that you preserve all their Warranty Disclaimers.

The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work.

In the combination, you must combine any sections Entitled "History" in the various original documents, forming one section Entitled "History"; likewise combine any sections Entitled "Acknowledgements", and any sections Entitled "Dedications". You must delete all sections Entitled "Endorsements."

6. COLLECTIONS OF DOCUMENTS

You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects.

You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document.

7. AGGREGATION WITH INDEPENDENT WORKS

A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, is called an "aggregate" if the copyright resulting from the compilation is not used to limit the legal rights of the compilation's users beyond what the individual works permit. When the Document is included in an aggregate, this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document.

If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate, the Document's Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate.

8. TRANSLATION

Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License, and all the license notices in the Document, and any Warranty Disclaimers, provided that you also include the original English version of this License and the original versions of those notices and disclaimers. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer, the original version will prevail.

If a section in the Document is Entitled "Acknowledgements", "Dedications", or "History", the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title.

9. TERMINATION

You may not copy, modify, sublicense, or distribute the Document except as expressly provided for under this License. Any other attempt to copy, modify, sublicense or distribute the Document is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.

10. FUTURE REVISIONS OF THIS LICENSE

The Free Software Foundation may publish new, revised versions of the GNU Free Documentation License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. See ` http://www.gnu.org/copyleft/'.

Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License "or any later version" applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation.

A.1.1 ADDENDUM: How to use this License for your documents ----------------------------------------------------------

To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page:


Copyright (C) YEAR YOUR NAME.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.2
or any later version published by the Free Software Foundation;
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
Texts. A copy of the license is included in the section entitled ``GNU
Free Documentation License''.

If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the "with...Texts." line with this:


with the Invariant Sections being LIST THEIR TITLES, with
the Front-Cover Texts being LIST, and with the Back-Cover Texts
being LIST.

If you have Invariant Sections without Cover Texts, or some other combination of the three, merge those two alternatives to suit the situation.

If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software.

 

付録 B この文書の翻訳

GNUjdoc プロジェクトの Nishio Futoshi は、このマニュアルの和訳を用意しました。 ` http://openlab.ring.gr.jp/gnujdoc/cvsweb/cvsweb.cgi/gnujdoc/' で最新のバージョンを見つけることができます。

 

訳注: この文書は上記の日本語マニュアルを基に nroff の形式に整え未翻訳の部分を翻訳して追加したものです。言い回し、日本語の綴りの間違い、気がついた翻訳誤りも修正しました。

2007-10-29