This assignment is about 2 related commands: diff and patch. They deal with text files.
diff - takes the names of 2 files as parameters, compares them, and produces text output expressing the differences between them.
patch - takes the name of a 1st file, plus that of a 2nd that contains output produced previously by the diff command. The diff command which produced the 2nd file had compared the 1st with some (unknown) 3rd file. patch reconstructs what the content of this 3rd file must have been, and outputs it.
Here's an example. Suppose we have 2 text files. Adhering to the above naming, they are our "1st file" and "3rd file." Their contents are:
| 1st file - "before" | 3rd file - "after" |
| Mary had a little lamb, Little lamb, Little lamb, Mary had a little lamb Whose fleece was white as snow. |
Mary had a leg of lamb, Little lamb, Little lamb, Mary had a little lamb Whose fleece was like the snow. |
The command
diff before after
produces the following output:
1c1
< Mary had a little lamb,
---
> Mary had a leg of lamb,
5c5
< Whose fleece was white as snow.
---
> Whose fleece was like the snow.
which expresses the differences in a way understood by both diff and patch. This output spills out onto the screen. Suppose I capture it into a file named diff.file as follows:
diff before after > diff.file
Suppose you also possess a copy of before. You lack a copy of after. I, and you, want you to have a copy of after. Without sending you one, I can instead send you a copy of diff.file. If you then run the command:
patch -b before diff.file -o after
it will output ( -o ) a file named after on your disk, identical to mine.
I have now indirectly provided you with a copy of after.
Typically, if before is very large, diff.file is much smaller than after. So it's efficient to supply the smaller file. The situation in which you and I would have identical copies of a to-be-changed file is if that file is a "standard" constituent of a product, such as a linux distribution. Then the whole world has exact copies of that same file. (Usually source files in a programming language like c.) The file maintainer can make the difference file available via the internet and the whole world can avail itself of the maintainer's new version, by using the patch command against the old.
The assignment
A file containing Mary Had a Little Lamb named "mary-had-a-little-lamb" can be found on the unix server, per your instructor.
Copy it to your home directory.
Rename it to something.
In that copy use the vi editor to make the necessary changes that convert the above "before" to "after." (Namely, replace the first line's "a little lamb" with "a leg of lamb" instead; and the last line's "fleece was white as" with "fleece was like the" instead.) I want to get a copy of the modified poem from you, but not directly.
Generate the differences between the original version and your version using diff, and capture those differences into a file named "mydifferences".
Deposit the mydifferneces file into your home directory's "assignments" subdirectory.
How I will grade you: using patch I will apply your mydifferences file against my copy of mary-had-a-little-lamb, and test whether the result equates to the original poem with substitution of "fleece was like the snow" for "fleece was white as snow," and "a leg of lamb" for "a little lamb." (The grading is automated and depends on the specified file nomenclature and placement.) You can check your work by duplicating my grading process: patch mary-had-a-little-lamb with mydifferences and make sure you get the results I expect.
Additional:
obtain file blink.c from the server. It makes the cursor blink. In a terminal
window (within the graphical interface) compile it.
gcc blink.c -o blink
Run it
./blink
observe the cursor blink, and the blink speed. Obtain from the instructor a diff file (named diff.blink-blinkslow) to re-code blink.c so that it will slow down. Apply it:
patch -b blink.c diff.blink-blinkslow
Now recompile the program:
gcc blink.c -o blinkslow
and re-run, noting the blink speed:
./blinkslow
Additional:
Obtain files more01.c and longfile from the server. more01 is a primitive,
amateur attempt to duplicate the behavior of the well-known more utility.
Compile more01.c:
gcc more01.c -o more01
Observe the behavior of giving text via standard input to both the real more program, and the amateur one:
cat longfile | more
cat longfile | ./more01
The amateur program doesn't do what is should-- stop screen scroll-off after a screenful of text has been diplayed. The real more program, of course, does. A version 2 of the amateur program fixes this.
Obtain from the instructor a diff file (named diff.more01-more02) to re-code more01 so that it will halt display after the first screenful. Apply it:
patch -b more01.c diff.more01-more02
and build a new executable:
gcc more01.c -o more02
Test the result to see that the problem is fixed:
cat longfile | ./more02
making sure it halts the display as it should.
Additional: obtain and examine one of the recent patch files for the
linux kernel. Visit www.kernel.org. There, navigate down to https://www.kernel.org/pub/linux/kernel/v3.x/.
Scoll to the bottom to find patch files, with names such as patch-3.10.13.gz.
Download one of these and open it in less, or an editor. The patch file is
more complicated than the simple one you produced, but diff understands it and
can use it to transform the source files for one version of linux to those of
the next.