必威电竞|足球世界杯竞猜平台

Patch
來源:互聯網

Patch,又稱補丁程序,是1985年由美國程序設計師拉里·沃爾(Larry Wall)開發的Unix應用程序。它利用一個名為patch file(有時直接被稱為patch)的文本文件,更新文本文件。patch文件是一個包含差異列表的文本文件,由運行與原始和已修改文件相關的diff程序時產生。通過patch程序更新文件,通常被稱為應用補丁或簡單地修改文件。

命令應用

用途

對文件應用更改。

語法

patch [ -b [ -B Prefix ] ] [ -f ] [ -l ] [ -N ] [ -R ] [ -s ] [ -v ] [ -c | -e | -n ] [ -d Directory ] [ -D Define ] [ -F Number ] [ -i PatchFile ] [ -o OutFile ] [ -p Number ] [ -r RejectFile ] [ -x Number ] [ File ]

描述

patch 命令讀取如何更改文件的源文件指示信息,然后應用這些更改。源文件包含由 diff 命令產生的差別列表(或者 diff 列表)。差異列表是比較兩個文件和構建關于如何糾正差別的指示信息的結果。缺省情況下,patch 命令使用從標準輸入讀入的源文件,但是使用 -i 標志和 PatchFile 變量可以覆蓋此設置。

差異列表有三種格式:正常、上下文或者是 ed 編輯器風格。patch 命令確定差異列表格式,除非被 -c、-e 或 -n 標志否決。

缺省情況下,文件的打過補丁的版本替換原始版本。指定 -b 標志時,每個補丁文件的原文件保存在同名的文件中,只是在文件名后附加了后綴 .orig。使用 -o 標志也可以指定輸出的目的地。

-p 標志使得無需手工編輯補丁文件就可以定制補丁文件到本地用戶目錄結構中。通過指定從路徑全稱除去多少部分可以做到這一點。例如,如果補丁文件包含路徑名稱 /curds/乳清/src/blurfl/blurfl.c,那么:

* -p 0 導致使用完整路徑名。

* -p 1 除去前導斜杠,留下 curds/whey/src/blurfl/blurfl.c。

* -p 4 除去前導斜杠和前三個目錄,留下 blurfl/blurfl.c。

不指定 -p 標志使得 patch 命令使用基本名稱。在上面的示例中,此文件為 blurfl.c。

補丁文件格式

補丁文件必須包含單行或多行頭信息,后跟單個或多個補丁。每個補丁必須包含一行或多行文件名標識,其格式由 diff -c 命令和單個或多個 diff 命令輸出集產生,通常稱為 hunks。

patch 命令跳過補丁文件中的任何前導文本,然后應用實際的差異列表,并且跳過任何后續文本。因而,可以將包含差異列表的文件或消息當成補丁文件使用,此時 patch 命令仍然有效。在這種情況下,如果整個差異列表使用一致的數量縮進,patch 命令也會調整其間距。

要更改原始文件中的行范圍,每一補丁中的塊(hunk)必須為單獨的差異列表。補丁內連續塊(hunk)的行號必須以升序方式出現。

文件名

如果沒有指定 File 參數,要獲得供編輯的文件名,patch 命令會執行下面的步驟:

1. 在上下文差異列表的頭部分,文件名由以 ***(三個星號)或者 ---(三個破折號)開頭的行確定。以 *** 開頭的行表示獲取補丁的文件,然而以 --- 開頭的行表示應該應用補丁的文件名。選擇存在文件的最短名稱。

2. 如果在前導文本中有 Index:行,patch 命令嘗試使用來自于那一行中的文件名。

3. 上下文差異文件頭優先于 Index: 行。

4. 如果從前導文本中不能確定文件名,patch 命令提示輸入需要打補丁的文件名。

5. 如果不能找到原始文件,但是有適合的 SCCS 或 RCS 文件可用,patch 命令嘗試獲取或檢出文件。

6. 如果前導文本包含 Prereq: 行,patch 命令從先決條件行中獲取第一個詞(通常是版本號)并且檢查輸入文件看是否能找到那個詞。如果找不到,patch 命令在繼續運行前會提示確認。

應用程序

如果補丁文件包含不止一個補丁,patch 命令嘗試應用每個差異列表,就好像它來自于單獨的補丁文件。在這種情況下,為每個差異列表確定需要打補丁的文件名,并且審查每個差異列表前的頭文本以獲得如文件名和修訂版級別的信息。

如果指定 -c、 -e 或 -n 標志,patch 命令將每塊(hunk)內的信息分別解釋成上下文差別、ed 編輯器差別或者正常差別。否則,patch 命令確定基于塊(hunk)內信息格式的差別類型。

patch 命令通過獲取塊(hunk)的首行序號和添加或減去由于應用前一塊(hunk)而產生的任何行偏移來搜索位置以應用每一塊(hunk)。如果在這一行位置不可能有精確匹配,patch 命令前后搜索以獲取與塊(hunk)的內容精確匹配的行集合。

如果找不到這些位置,且如果 patch 命令正在應用上下文差異列表,patch 命令能進行非精確搜索。fuzz factor 指定了非精確匹配的行數目。如果模糊因子設置成 1 或者更大,patch 命令執行第二次掃描,這一次忽略上下文的第一行和最后一行。如果沒有匹配結果,且最大模糊因子設置成 2 或者更大, patch 命令執行第三次掃描,這一次會忽略上下文的前兩行和最后兩行。(缺省模糊因子最大值為 2)。如果找不到匹配的位置,patch 命令在拒絕文件中放置塊(hunk)。創建拒絕文件時,其名稱和輸出文件一樣,只是在文件名有后綴 .rej。使用 -r 標志可以覆蓋此命名約定。

以上下文差異列表格式寫拒絕塊(hunk),而不管補丁文件的格式如何。如果輸入是正常差別或 ed 編輯器樣式差別,拒絕文件可能包含上下文格式零行差別。拒絕文件中塊(hunk)的行編號可能與補丁文件中的行編號不同。這是因為拒絕文件的行編號反映了新文件而不是老文件中故障塊(hunk)的大約位置。

當完成每塊(hunk)后,patch 命令會告訴您該塊(hunk)是成功還是失敗。也可以獲知為每塊(hunk)假定的新行編號。如果這與差異列表中指定的行編號不同,就會報告偏移量。patch 命令也說明是否使用模糊因子來進行匹配。

注:單一的大偏移可能表示塊(hunk)安裝位置不正確。模糊因子的使用可能表示布局不正確。

準備補丁

原則

準備將補丁裝載給其它用戶的程序員應該考慮下面的附加原則:

* 如果想兩次應用同一補丁,patch 命令假定第二個應用程序應該是逆向補丁,并且提示確認此逆向。因此,避免發送出這些逆向補丁,因為它使用戶疑惑他們是否已經應用了此補丁。

* 建議保留使用最新補丁級別更新的 patchlevel.h 文件。補丁級別可以用作所發送的補丁文件中的第一個差異列表。如果補丁中包含 Prereq: 行,用戶不能應用順序混亂的補丁,同時不收到警告。

* 在上下文差異列表的頭中或者使用 Index: 行以確保正確指定了文件名。如果正在子目錄中打某些補丁,請確保通知補丁用戶在需要時指定 -p 標志。

* 可以通過發送差異列表創建文件,此列表比較一個空文件和想要創建的文件。然而,這個方法只有在想要創建的文件的確不存在于目標目錄時才有效。

* 雖然可以將許多差分列表放置到一個文件中,但是將相關補丁分組到單獨的文件中會更好。

* patch 命令不能說明 ed 腳本中的行編號是否正確,只能在當它找到更改或刪除命令時才能檢測正常差異列表中不正確的行編號。使用模糊因子為 3 的上下文差異列表可能有同樣的行編號問題。除非添加了一個適當的交互式接口,在這種情形下才使用上下文差異列表來檢測更改的正確性。編譯無誤通常表示補丁工作正常,但是它并不表示沒有錯誤。

* 只有當補丁應用到與生成補丁的完全同一版本的文件中,才保證 patch 命令的結果。

* 如果代碼重復,例如:

#ifdef

... NEWCODE

#else

... OLDCODE

# endif

patch 命令不能為兩個版本都打補丁。如果 patch 命令成功,它可能補丁了錯誤版本但是返回了一個成功的退出狀態。

標志

-b 在應用差別前保存每個修改后文件的副本。復制的原始文件歸檔時與原文件同名且添加了后綴 .orig。如果使用那個名稱的文件已經存在,它就被覆蓋。如果對同一文件應用多個補丁,原始文件只生成一個副本(在第一次補丁時)。如果也指定 -o OutFile 標志,就不會創建 .orig 文件。但是如果指定文件已經存在,就創建 OutFile.orig。

-B Prefix 指定備份文件名稱的前綴。此標志只有在和 -b 標志連接使用時才有效。

-c 將補丁文件解釋成上下文差異列表(diff -c 或 diff -C 命令的輸出)。此標志不能和 -e 或 -n 標志一起使用。

-d Directory 在處理前,更改當前目錄到指定目錄。

-D Define 使用下面的 C 預處理器構造標記更改:

#ifdef Define

... (NEWCODE)

#else

... (OLDCODE)

#endif /* Define */

Define 變量用作差分符號。此標志只有當正常或上下文格式差異列表用作補丁文件時才有效。

-e 將補丁文件解釋成 ed 編輯器腳本。此標志不能和 -c 或 -n 標志一起使用。

-f 禁止查詢用戶。要禁止注釋,使用 -s 標志。

-F Number 設置最大模糊因子。此標志只應用于上下文差異列表,它使 patch 命令在確定塊(hunk)的安裝位置時忽略指定行編號。如果沒有指定 -F 標志,缺省模糊因子為 2。此因子不可以設置成大于上下文差異列表中內容的行的數目(通常為 3)。

注:較大的模糊因子會增加錯誤補丁的可能性。

-i PatchFile 從指定文件,而不是從標準輸入中讀取補丁信息。

-l (L 的小寫)使差異列表腳本中的任何空格字符序列匹配輸入文件中的任何空格字符序列。精確匹配其它字符。

-n 將腳本解釋成正常差異列表。此標志不能和 -c 或 -e 標志一起使用。

-N 忽略差別已經向文件應用了的補丁。缺省情況下,會拒絕已經應用的補丁。

-o OutFile 復制要打補丁的文件,然后應用更改,接著將修改版本寫到指定的輸出文件。單個文件的多個補丁應用于以前補丁所創建的文件的中間版本。因此,多補丁會生成輸出文件的多個連接版本。

-p Number 設置路徑名的剝離數目,它控制如何處理在補丁文件中找到的路徑名稱。如果將文件保留在與指定路徑不同的目錄中,此標志就有用。剝離數目指定了從路徑名前去除多少個斜杠。也去除所有中間的目錄名。例如,假定補丁文件指定 /u/leon/src/blurf1/blurf1.c:

* -p 0 留下未修改的完整路徑名。

* -p 1 除去前導斜杠,留下 u/leon/src/blur一級方程式錦標賽/blurf1.c。

* -p 4 卸下四個斜杠和三個目錄,留下 blurf1/blur2012年世界一級方程式錦標賽c。

如果沒有指定 -p 標志,只使用基本名稱(最后的路徑名稱組件)。此標志只有在沒有指定 File 參數時才起作用。

-r RejectFile 覆蓋缺省拒絕文件名。通過附加后綴 .rej 到原始文件名中,就形成了缺省拒絕文件名。

-R 逆向補丁腳本理解。例如,如果從新版本到舊版本創建差異列表,使用 -R 標志使 patch 命令在應用前逆向腳本的每個部分。以交換格式保存拒絕差別。 -R 標志不能和 ed 腳本一起使用,因為其中只有很少的信息可以重新構造逆向操作。如果沒有指定 -R 標志,patch 命令嘗試以逆向理解和正常理解應用每個部分,直到成功應用補丁文件的每一部分。如果嘗試成功,提示用戶確定是否應該設置 -R 標志。

注:如果此方法和第一個命令是附加命令(就是說,逆序是刪除)的正常差異列表一起使用,它就不能檢測逆向補丁。因為空上下文無論在何處都匹配,所以附加總是成功的。幸運的是,大多數補丁是添加或更改行而不是刪除行。因此大多數逆序的正常差異列表以一個刪除開始,它導致故障,并且引起啟發(heuristic)。

-s 靜默地進行補丁,直到發生錯誤。

-v 打印修訂版頭和補丁級別。如果 -v 標志和其它標志一起使用,就忽略其它標志。

-x Number 設置內部調試標志。此標志只適用于 patch 命令開發者。

退出狀態

返回下面的出口值:

0 成功完成。

1 產生錯誤。

示例

1. 要將 difflisting 文件中的差異列表應用到 prog.c 文件,請輸入:

patch -i difflisting prog.c

2. 要保存 prog.c 文件的原始版本,請輸入:

patch -b -i difflisting prog.c

它將更改應用到 prog.c 并且在 prog.c.orig 文件中保存 prog.c 的原始內容。

3. 要打補丁到 prog.c 文件而不改變原始版本,請輸入:

patch -i difflisting -o prog.new prog.c

它將 prog.c 當成源文件使用,但是更改后的版本寫到名為 prog.new 的文件中。

文件

/usr/bin/patch 包含 patch 命令。

參考資料 >

生活家百科家居網