October 2018  |  01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

第1回「patchコマンド」


メルマガで連載している「LPIC2対策UPDATE」を再掲します。市販の教材では十分に対応できていない部分を強化する内容を連載していきます。今回はpatchコマンドについてです。

■第1回「patchコマンド」

 パッチとは、新旧ファイルの差分(パッチ)のことである。古いファイルに対してパッチを適用する(パッチを当てる)ことによって、新しいファイルにアップデートできる。Linuxカーネルソースにおいてもパッチが提供されている。

 パッチコマンドの基本的な使い方を見てみよう。例えば、oldfileとnewfileの差分ファイルがtest.patchであったとしよう。 旧ファイルoldfileにパッチを適用するには、次のようにする。

 $ patch oldfile < test.patch

これで、oldfileファイルの内容はnewfileと同じになる。ちなみに差分ファイルtest.patchはdiffコマンドで作成できる。

 $ diff oldfile newfile > test.patch

 パッチを適用したものの、新たな不具合が起こるなどして元に戻したい場合があるだろう。パッチ適用前の状態に戻すには、-Rオプションを使う。

 $ patch -R oldfile < test.patch

 通常、パッチはディレクトリ単位で作成する(ほとんどのソフトウェアは複数のソースファイルで構成されている)。次の例では、dir01からdir02への差分ファイルdir.patchを使い、dir01の内容をdir02にアップデートしている。

 $ patch -p0 < dir.patch

 複数ファイルの差分を取った場合、パッチファイル内にはどのファイルに対する差分なのかという情報が格納される。しかし、例えばパッチ作成者のディレクトリ構成とパッチ適用者のディレクトリ構成が異なる場合(/usr/src/linuxと/usr/src/linux-2.6など)、パスにずれが生じて、そのままではうまくパッチが適用できないことになる。-pオプションを使えば、パッチファイル内のパスの先頭部分を無視させることができる。
 例えば、パッチファイル内のパスがlinux/Makefileとなっているような場合、-p1を指定すると「linux/」部分が無視される。Makefileの格納されているディレクトリに移動してpatchコマンドを実行すればよい。

 $ patch -p1 < patchfile

その他、patchコマンドには次のようなオプションもある。

  • b バックアップを作成する(元のファイルをリネームして残す)
  • B pref バックアップ時するファイル名にプレフィックスを付ける
  • z suff バックアップ時するファイル名にサフィックスを付ける
  • d dir 指定したディレクトリに移動してからパッチを適用する
  • i file パッチファイルを指定する
    • dry-run 実際にはパッチを適用しない(パッチの対応をチェックする)

 パッチの適用が失敗した場合は、〜.rejという名前のファイルが生成されるので、その内容を見てパッチファイルの内容を手動で更新すればよい。

pagetop