刚把LFS重头到尾过了一遍,一下子过够了configure->make->make install这三部曲的瘾了...

在编译软件包或者是内核的时候,经常需要根据特定的需求对源代码文件打补丁,补丁可以在专门的网站上下载,比如www.kernel.org,也可以自己制作(前提是技术水平要够格)。得到xxx.patch文件后,就需要使用patch命令将其补上,所以应该要会使用patch命令的基本用法;如果要自己生成patch文件,就需要使用diff命令。


diff  ==  -  (类似于减号,做差)用来比较两个文件,输出它们间的不同之处
patch ==  +  (类似于加号,做和)将包含两文件差异部分的文件附加到原始文件上,产生新文件
 
举例说明:
  1. root@hdp0:patch# nl A 
  2.      1  00000 
  3.      2  00000 
  4.      3  00000 
  5. root@hdp0:patch# nl B 
  6.      1  11111 
  7.      2  00000 
  8.      3  00000 
A和B两个原始文件,A是旧文件,B是新文件
 
  1. root@hdp0:patch#diff -rNu A B > C 
  2. root@hdp0:patch# nl C 
  3.      1  --- A   2011-07-27 21:35:32.977011747 +0800 //-号表示旧文件,其后是A的详细信息
  4.      2  +++ B   2011-07-27 21:35:43.644398050 +0800 //+号表示新文件,其后是A的详细信息
  5.      3  @@ -1,3 +1,3 @@ //@@之间表示差异块,-1,3表示A的内容是3行,有删除,+1,3表示B的内容是3行,要增加
  6.      4  -00000 //00000这行删除
  7.      5  +11111 //增加11111这行
  8.      6   00000 
  9.      7   00000 
可以看到使用diff命令后生成的C文件内容,C文件就可以算一个使A变为B的patch文件。
其中diff的3个参数的意义是:
  -r 对目标文件或者目录递归对比
  -N 在对比时,仅出现一次的文件在对应的文件那里表示为空文件
  -u 使用详细的对比信息显示
PS:这里要注意,diff命令中的A,B是区分新旧的,产生的C文件只是针对旧文件A的,意思是patch命令只能用C把A变成B,而不能使B变成A。
 
  1. root@hdp0:patch# patch -Np0 -i C 
  2. patching file A 
  3. root@hdp0:patch# nl A 
  4.      1  11111 
  5.      2  00000 
  6.      3  00000 
从上面的结果中可以看见A已经变成B了。系统会自动根据C中的信息,选择更新的目标,在patch命令中并不需要指定使用补丁的目标文件。
其中patch的选项的意义是:
  -Np0 N表示注意空文件和是否已经打过补丁,而p0表示搜索补丁的目标文件时直接使用C中包含的A文件路径。p1则表示从C中包含的A文件路径的次级目录搜索。这个和使用diff命令时的状态有关系。
  -i 后接补丁文件,如果没有-i,则需要使用 < 符
 
如果打完补丁后觉得不合适,还可以撤销补丁,也就是将B再变回A
  1. root@hdp0:patch# patch -RE -p0 -i C //RE参数决定了回溯效果
  2. patching file A 
  3. root@hdp0:patch# nl A 
  4.      1  00000 
  5.      2  00000 
  6.      3  00000 
内容又变为原始的A文件了。