The POSIX standard specifies behavior that differs from patch
's
traditional behavior. You should be aware of these differences
if you must interoperate with patch
versions 2.1 and earlier,
which do not conform to POSIX.
•
In traditional patch
, the -p
option's operand was optional,
and a bare -p
was equivalent to -p0.
The -p
option now
requires an operand, and -p 0
is now equivalent to -p0
. For
maximum compatibility, use options like -p0
and -p1
.
Also, traditional patch
simply counted slashes when stripping
path prefixes; patch
now counts pathname components. That is,
a sequence of one or more adjacent slashes now counts as a
single slash. For maximum portability, avoid sending patches
containing //
in file names.
•
In traditional patch
, backups were enabled by default. This
behavior is now enabled with the -b
or --backup
option.
Conversely, in POSIX patch
, backups are never made, even when
there is a mismatch. In GNU patch
, this behavior is enabled
with the --no-backup-if-mismatch
option, or by conforming to
POSIX with the --posix
option or by setting the
POSIXLY_CORRECT
environment variable.
The -b
suffix option of traditional patch
is equivalent to the
-b -z
suffix options of GNU patch
.
•
Traditional patch
used a complicated (and incompletely
documented) method to intuit the name of the file to be
patched from the patch header. This method did not conform to
POSIX, and had a few gotchas. Now patch
uses a different,
equally complicated (but better documented) method that is
optionally POSIX-conforming; we hope it has fewer gotchas.
The two methods are compatible if the file names in the
context diff header and the Index:
line are all identical
after prefix-stripping. Your patch is normally compatible if
each header's file names all contain the same number of
slashes.
•
When traditional patch
asked the user a question, it sent the
question to standard error and looked for an answer from the
first file in the following list that was a terminal: standard
error, standard output, /dev/tty
, and standard input. Now
patch
sends questions to standard output and gets answers from
/dev/tty
. Defaults for some answers have been changed so that
patch
never goes into an infinite loop when using default
answers.
•
Traditional patch
exited with a status value that counted the
number of bad hunks, or with status 1 if there was real
trouble. Now patch
exits with status 1 if some hunks failed,
or with 2 if there was real trouble.
•
Limit yourself to the following options when sending
instructions meant to be executed by anyone running GNU patch
,
traditional patch
, or a patch
that conforms to POSIX. Spaces
are significant in the following list, and operands are
required.
-c
-d
dir
-D
define
-e
-l
-n
-N
-o
outfile
-p
num
-R
-r
rejectfile