Linuxコマンド辞典 patchコマンド(テキスト処理)

差分を適用する「patch」コマンドの概要と使い方を記載しています。

RHEL Fedora CentOS Vine Deblan Ubuntu Plamo

参考サイト:Man page of INSTALL

概要・使用方法

ソフトウェアに不具合が起きた場合に、ソースコードに修正を行いバージョンアップを行います。そのことをパッチを適用すると言います。新旧ファイルの差分をパッチファイルといい、diffコマンドによって作成されます。patchコマンドは、パッチファイルを旧ファイルに適用して新しい内容に更新します。パッチファイルが作成された環境とパッチを適用する環境ではディレクトリ構成が異なることがあります。その場合は、パッチファイル内に記載されているパスとパッチの適用環境でのパスが異なり、正常にパッチが適用できません。そのような場合は、「-p」オプションを使ってパスを適切に設定します。

書式

$ patch [オプション] [元ファイル名[パッチファイル名]]
$ patch -p 数値 < パッチファイル名

オプション

-b
–backup
パッチ適用前のファイルに指定文字列を付加してバックアップうる・指定しない場合は.origを付加する
-z 文字列
–suffix=文字列
バックアップのファイル拡張子を指定した文字列にする
-p [数値]
–strip[=数値]
パッチファイル内のパス名を修正して適用する
-p0:パス名を修正しない
-p1:最初の「/」まで削除する
-p2:次のディレクトリまで削除する
-c
–context
バッチファイルをcontext形式と認識する
-d ディレクトリ名
–directory=ディレクトリ名
指定したディレクトリに移動してからバッチ処理を行う
–dry-runバッチ適用結果を表示するが何もしない
-e
–ed
バッチファイルをedスクリプトと認識する
-i ファイル名
–input=ファイル名
バッチリストとして指定したファイルを読み込んでバッチを適用する。「-」を指定した場合は標準入力から読み込む
-l
–ignore-whitespace
タブや空白を無視する
-o ファイル名
–output=ファイル名
出力するファイルを指定する
-R
–reverse
バッチが当たったファイルから、パッチ適用を戻す

パッチを適用する

$  patch < パッチファイル

実行結果

diffコマンドでパッチファイルを作成します。

[sunarin@localhost work]$ cat hello.c.org 
/* hello.c --- test code by sunarin  */
#include <stdio.h>
int main(int argc, char *argv[]){
    printf("hello.\n");
}
[sunarin@localhost work]$ cat hello.c
/* hello.c --- test code by sunarin  */
#include <stdio.h>
int main(int argc, char *argv[]){
    printf("hello.\n");
    return(0);
}
[sunarin@localhost work]$ diff -u hello.c.org hello.c > hello.patch
[sunarin@localhost work]$ cat hello.patch 
--- hello.c.org 2022-05-05 16:31:30.306787900 +0900
+++ hello.c     2022-05-05 16:31:51.931787900 +0900
@@ -2,4 +2,5 @@
 #include <stdio.h>
 int main(int argc, char *argv[]){
     printf("hello.\n");
+    return(0);
 }
[sunarin@localhost patch]$

作成したパッチファイルを旧ファイルのhello.cファイルに対して適用します。

[sunarin@localhost patch]$ patch < hello.patch 
patching file hello.c
[sunarin@localhost patch]$ cat hello.c 
/* hello.c --- test code by sunarin  */
#include <stdio.h>
int main(int argc, char *argv[]){
    printf("hello.\n");
    return(0);
}
[sunarin@localhost patch]$ 

「Reversed (or previously applied) patch detected! Assume -R? [n] ^C」というメッセージが表示された場合は、すでにパッチが適用されたファイルに対して行おうとしています。