このページの内容

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個以上のスラッシュは1個と数えます。移植性を最大限に保つには、ファイル名に//を含むパッチを送らないでください。

  • 従来のpatchではバックアップが既定で有効でした。現在は--backup(-b)で有効にします。

    反対に POSIX のpatchでは、不一致でもバックアップを作りません。GNU patchでは、--no-backup-if-mismatchオプションまたは POSIX 準拠でこの動作を有効にします。

    従来のpatchの-b suffixオプションは、GNU patchの ‘-b -z suffix’ オプション群と同等です。

  • 従来のpatchは、パッチのヘッダーから対象名を推定するのに複雑で説明も不十分な方法を使っていました。POSIX 非準拠で、落とし穴もありました。現在patchは、同様に複雑ですが説明が充実した別の方法を使い、任意で POSIX 準拠にできます。落とし穴が減ることを期待しています。コンテキスト diff のヘッダーと ‘Index:’ 行の名前が接頭辞除去後にすべて同じなら、2つの方法には互換性があります。各ヘッダーの名前に含まれるスラッシュ数がすべて同じなら、通常パッチは互換になります。
  • 従来のpatchは質問を標準エラーへ送り、標準エラー、標準出力、/dev/tty、標準入力の順で、最初に端末だったファイルから回答を読みました。現在patchは質問を標準出力へ送り、/dev/ttyから回答を読みます。一部の回答の既定値も変わり、patchが既定の回答を使って無限ループに陥ることを防いでいます。
  • 従来のpatchは、失敗したハンクの数を終了ステータスとし、本当の問題がある場合は1で終了しました。現在patchは一部のハンクが失敗すれば1、本当の問題があれば2で終了します。
  • GNU patch、従来のpatch、POSIX 準拠のpatchのいずれを使う人にも実行してもらう説明を送る場合、オプションは次のものに限ってください。この一覧ではスペースに意味があり、オペランドは必須です。
    -c
    -d dir
    -D define
    -e
    -l
    -n
    -N
    -o outfile
    -pnum
    -R
    -r rejectfile