Lから始まるLinux

2章44話
差分
2章45話 パッチ
もくじ
2章46話
プロセス置換
パッチ
若木 しげる
diff の出力は 「パッチ(patch)」にもなるよ!
若木 みどり
変更前と変更後の 二つのファイルの「違い」 表すファイルだよね?
若木 しげる
そのとおり! 変更前のファイルとパッチから 変更後のファイルを 作ることができるんだ
若木 しげる
今回はそんなパッチの 扱いを学んでいこう!
パッチ作成
若木 みどり
前回は以下のコマンドで 比較するための二つのファイル a.txtb.txt を作ったね!
cat > a.txt << EOF
111
222
333
444
555
666
777
888
999
EOF
cat > b.txt << EOF
111
333
444
555
656
777
888
999
000
EOF
若木 しげる
それではこれらの差分をパッチ ab.patch にしよう!
若木 しげる
パッチは unified diff 形式が一般的だよ-u オプションを指定して出力しよう
diff -u a.txt b.txt > ab.patch
若木 みどり
うん!出力したよ!中身はこんな感じみたい…
cat ab.patch
--- a.txt       2025-05-12 17:25:22.302944148 +0900
+++ b.txt       2025-05-12 17:25:38.967887343 +0900
@@ -1,9 +1,9 @@
 111
-222
 333
 444
 555
-666
+656
 777
 888
 999
+000
若木 みどり
「統一された(unified)」の通り差分が一つの記述にまとまっている形式なんだね
若木 しげる
diff 形式との大きな違いは比較した二つのファイル名が出力に含まれていることだよ
若木 みどり(驚き)
言われてみれば…!diff 形式は差分内容しか出力されていなかったね
patch コマンド
若木 みどり
このパッチ ab.patcha.txt に反映させるにはどうすればいいのかな?
若木 しげる
patchファイルにパッチを適用するよ
若木 しげる
書式で覚えるよりも入力リダイレクトで使うと覚えよう!以下のように実行してみてね
patch < ab.patch
若木 みどり
どれどれ?
patching file a.txt
若木 みどり
a.txt ファイルにパッチを当てています」と表示されたね!
若木 しげる
unified diff 形式の内容にはファイル名も含まれているのでパッチファイルを入力リダイレクトするだけで処理してくれるんだよ
若木 みどり
もう a.txt の内容はパッチが当てられたのかな?
若木 しげる
それは中身を表示させて確認してみよう!
cat a.txt
若木 みどり
うん!
111
333
444
555
656
777
888
999
000
若木 みどり
変更されたっぽいけど内容は合っているのかな?
若木 しげる
せっかく diff を覚えたのだからパッチを当てた a.txtb.txt を比較してみよう
若木 しげる
ちゃんとパッチが当たっていれば二つのファイル内容に差はないはずだよ
若木 みどり(驚き)
おー!人間の目で見比べるとミスが怖いよね機械的に処理できるのならdiff に任せよう!
diff a.txt b.txt
若木 みどり(笑顔)
うん!何も表示されない!ということは差が無いんだね!ちゃんとパッチが当たっていたよ
まとめ
若木 みどり
今回はパッチの扱いを学んだよ!diff-u オプションでunifided diff 形式のパッチを出力してpatch でパッチを適用できるんだ!
若木 しげる
ソフトウェア配布などではパッチも一緒に提供されていることがあるよ大元のファイルが手元にあればパッチをダウンロードして適用するだけで新しいバージョンにすることができるんだ