プログラムにバグがある場合、それを修正したプログラムを作ります。 両者の diff をとったのがパッチファイルです。 パッチファイルは、コマンド patch を用いることにより、 古いファイルを新しいファイルに直すことができます。
例として、次の2つのファイルを考えます。 修正したファイルは、 元のファイルよりも長い名前をつけておきます。test
test.new
one tuo (←スペルミス) three four five seven (←six が抜けている) eight nine ten
one two (←スペルが直っている) three four five six (←six が入った) seven eight nine ten
コマンド diff のオプションを用いて、 test を test.new に修正するためのパッチを作ります。 共に、違いのある行の前後3行を含めて違いを表示します。その1
% diff -c test test.new > test.patch (名前はなんでもよいです) % cat test.patch *** test Sat Apr 15 00:59:53 2000 --- test.new Sat Apr 15 00:43:59 2000 *************** *** 1,8 **** one ! tuo three four five seven eight nine --- 1,9 ---- one ! two three four five + six seven eight nineその2
% diff -u test test.new > test.patch (名前はなんでもよいです) % cat test.patch --- test Sat Apr 15 00:59:53 2000 +++ test.new Sat Apr 15 00:43:59 2000 @@ -1,8 +1,9 @@ one -tuo +two three four five +six seven eight nineさらに詳しいオプションについては、man diff を参照してください。
パッチ当ては、コマンド patch を使います。 patch は *** 、--- もしくは +++ の行のファイルのうち、 名前の短い方にパッチを当てようとします。 したがって、修正ファイル名は元ファイル名よりも 長くしておきます。 test, test.new のあるディレクトリにいき、 次のようにします。
% ls test test.new test.patch % patch < test.patch % ls test test.new test.orig test.patch % diff test test.new %
場合によっては、ファイルのあるディレクトリではない場所で パッチファイルを作ることもあるでしょう。 そのような場合、パッチファイルの先頭のファイル名は、 相対パスコミの表示になります。例えば、/somewhere にいて、 /somewhere/dir1/dir2/dir3/dir4/test と /somewhere/dir1/dir2/dir3/dir4/test.new の パッチファイル test.patch を作ると、
となります。これを、いろんな場所でパッチを当てるには -p オプションを使います。例えば、-p2 はパッチファイル中の ファイル名の中から、2つの / を消去し、 dir3/dir4/test と読み変えます。
% pwd /somewhere % diff -c dir1/dir2/dir3/dir4/test dir1/dir2/dir3/dir4/test.new *** dir1/dir2/dir3/dir4/test Sat Apr 15 00:59:53 2000 --- dir1/dir2/dir3/dir4/test.new Sat Apr 15 00:43:59 2000 ..../somewhere で当てる
/somewhere/dir1 で当てる
% patch < test.patch
/somewhere/dir1/dir2 で当てる
% patch -p1 < test.patch
/somewhere/dir1/dir2/dir3 で当てる
% patch -p2 < test.patch
/somewhere/dir1/dir2/dir3/dir4 で当てる
% patch -p3 < test.patch
% patch -p4 < test.patch
さらに詳しいオプションについては man patch を参照してください。 なお、-p がオプションで一致する2つ以上のパッチファイルは 後ろにつなげて行ってひとつのパッチファイルとすることができます。 当て方は上と同様です。