| HOME / 정보공유 / AIX 명령어 모음

patch
patch 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 리스트)가 들어 있습니다. diff 리스트는 두 파일을 비교하여 차이점을 조정하는 방법에 관한 지침을 구축한 결과입니다. 디폴트로 patch 명령은 표준 입력에서 읽은 소스 파일을 사용하지만, 이는 -i 플래그 및 PatchFile 변수를 사용하여 대체될 수 있습니다.
diff 목록은 일반, 문맥(context) 또는 ed 편집기 양식과 같은 세가지 형식으로 이루어집니다. patch 명령은 -c, -e 또는 -n 플래그에 의해 무효가 되는 경우가 아니라면 diff 목록 형식을 결정합니다.
디폴트로, 패치된 파일 버전은 원래 버전으로 대체됩니다. -b 플래그가 지정되면, 각 패치된 파일의 원본은 접미사 .orig가 추가되어 동일한 이름의 파일에 저장됩니다. -o 플래그를 사용하여 출력시킬 위치를 지정할 수도 있습니다.
-p 플래그를 사용하면, 패치 파일을 수동으로 편집하지 않고 국지 사용자 디렉토리 구조로 패치 파일을 조정할 수 있습니다. 이는 전체 경로 이름에서 제거할 구성요소의 수를 지정하여 수행됩니다. 예를 들면, 패치 파일에 경로 이름 /curds/whey/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 명령 출력(통상 hunk로 불림)으로 작성되는 형식으로, 하나 이상의 파일 이름 식별 행을 포함해야 합니다.
patch 명령은 패치 파일의 선행 텍스트를 생략하고 실제 diff 목록을 적용한 후 모든 후속 텍스트를 생략합니다. 따라서 diff 목록을 포함하는 조항이나 메세지를 패치 파일로 사용할 수 있으며, patch 명령은 여전히 작동합니다. 그 경우, 전체 diff 목록이 일정한 양만큼 행의 안쪽으로 들어가 있을 때에는, patch 명령도 해당 영역 확보를 위해 조정됩니다.
원본 파일에 있는 행 범위를 변경하려는 경우, 패치의 각 hunk는 별도의 diff 목록이어야 합니다. 패치에서 연속적인 hunk의 행 번호는 오름차순으로 발생되어야 합니다.
파일 이름 판별
File 매개변수가 지정되지 않은 경우, patch 명령은 편집할 파일의 이름을 얻기 위해 다음 단계를 수행합니다.
문맥 diff 리스트의 헤더에서, 파일 이름은 *** 또는 ---로 시작되는 행에 나와 있습니다. ***로 시작되는 행은 패치를 가져온 파일의 이름을 나타내며, ---로 시작되는 행은 패치가 적용될 파일의 이름을 나타냅니다. 기존 파일 이름 중 가장 짧은 것이 선택됩니다.
Index: 행이 선행 텍스트에 있는 경우, patch 명령은 그 행의 파일 이름을 사용합니다.
문맥 diff 헤더가 Index: 행보다 우선 적용됩니다.
판별할 수 있는 파일 이름이 선행 텍스트에 없는 경우, patch 명령은 패치할 파일의 이름을 입력하라는 프롬프트를 표시합니다.
원래 파일은 찾을 수 없지만 적절한 SCCS(소스 코드 제어 시스템)나 RCS 파일은 사용할 수 있는 경우, patch 명령은 파일을 가져오거나 검사하려고 합니다.
Prereq: 행이 선행 텍스트에 포함된 경우, patch 명령은 전제조건 행의 첫 번째 단어(일반적으로 버전 번호)를 선택하고 입력 파일에서 그 단어를 찾을 수 있는지 검사합니다. 포함되지 않으면, patch 명령은 진행하기 전에 확인을 위한 프롬프트를 표시합니다.
패치 응용프로그램
패치 파일이 하나 이상의 패치를 포함하는 경우, patch 명령은 별도의 패치 파일에서 작성된 것처럼 각각의 diff 목록을 적용하게 됩니다. 이 경우, 각 diff 목록마다 패치할 파일의 이름을 판별하며 파일 이름 및 개정 레벨과 같은 정보를 보기 위해 diff 목록 앞의 헤더 텍스트를 검사합니다.
-c, -e 또는 -n 플래그를 지정하는 경우, patch 명령은 각 hunk 내의 정보를 문맥 차이점, ed 편집기 차이점 또는 일반 차이점으로 해석합니다. 지정하지 않는 경우, patch 명령은 hunk 내의 정보 형식에 따라 차이점의 유형을 판별합니다.
patch 명령은 hunk의 최초 행 번호를 선택한 후 이전 hunk를 적용하여 발생된 모든 행 오프셋을 추가하거나 제외하여 각 hunk를 적용할 장소를 탐색합니다. 이 행 위치에서 정확하게 일치할 수 없으면, patch 명령은 hunk 내용과 정확하게 일치하는 일련의 행을 앞뒤로 스캔합니다.
그럴만한 장소가 없고 patch 명령이 문맥 diff 목록에 적용되면, patch 명령은 보다 덜 일치하는 장소를 탐색할 수 있습니다. fuzz 요소는 정확하게 일치해야 하는 행 수를 지정합니다. fuzz 요소가 1 이상으로 설정되면, patch 명령은 두 번째 스캔을 수행하며 이 때 문맥의 최초 행과 최종 행은 무시됩니다. 일치하는 결과가 없고 최대 fuzz 요소가 2 이상으로 설정되면, patch 명령은 세 번째 스캔을 수행하고 이 때 문맥의 최초 두 행과 최종 두 행은 무시됩니다(디폴트 최대 fuzz 요소는 2입니다). 일치하는 내용이 없으면, patch 명령은 hunk를 거부 파일에 둡니다. 거부 파일은 출력 파일과 동일한 이름과 접미사 .rej로 작성됩니다. 이 명명 규칙은 -r 플래그를 사용하여 대체될 수 있습니다.
거부된 hunk는 패치 파일의 형식에 관계없이 문맥 diff 목록 양식으로 기록됩니다. 입력이 정규 또는 ed 편집기 양식 차이점인 경우, 거부 파일은 0 행에 문맥 형식과의 차이점을 포함할 수 있습니다. 거부 파일에서 hunk의 행 번호는 패치 파일의 행 번호와 다를 수 있습니다. 이것은 거부 파일 행 번호가 기존 파일이 아닌 새 파일의 불량 hunk에 대해 거의 정확한 위치를 반영하였기 때문입니다.
각 hunk가 완료되면, patch 명령은 hunk가 완료되었는지 실패했는지 여부를 알려줍니다. 또한 각 hunk에 부여된 새로운 회선 번호를 알려주기도 합니다. 이것이 diff 목록에 지정된 회선 번호와 다른 경우, 오프셋을 알려줍니다. 또한, patch 명령은 fuzz 요소가 내용의 일치를 위해 사용되었는지 여부를 알려주기도 합니다.
주: 하나의 커다란 오프셋은 hunk가 잘못된 장소에 설치되었다는 것을 의미할 수 있습니다. fuzz 요소의 사용 또한 잘못된 배치를 의미할 수도 있습니다.
다른 사용자를 위한 패치 준비
다른 사용자에게 보내질 패치를 준비하는 프로그래머는 다음과 같은 추가적인 지침을 고려해야 합니다.
동일한 패치를 두 번 적용할 경우, patch 명령은 두 번째로 적용된 패치를 역방향 패치로 가정하고 이 역방향 패치를 확인하라는 프롬프트를 표시합니다. 따라서 이 역방향 패치를 전송하면 사용자가 이 패치를 이미 적용했는지 모를 수 있으므로 역방향 패치는 전송하지 마십시오.
patchlevel.h 파일은 최신 패치 레벨로 계속 갱신하는 것이 좋습니다. 그러면 패치 레벨은 전송한 패치 파일의 최초 diff 목록으로 사용될 수 있습니다. 패치에 Prereq: 행이 들어 있으면, 사용자는 경고를 수신하지 않고는 순서가 틀린 패치를 적용할 수 없습니다.
문맥 diff 리스트 헤더에서 또는 Index: 행을 사용하여 파일 이름이 정확하게 지정되었는지 확인하십시오. 서브디렉토리에서 패치를 수행하고 있는 경우, 필요하면 -p 플래그를 지정하도록 사용자에게 알리십시오.
널(null) 파일과 작성할 파일을 비교하는 diff 리스트를 전송하여 파일을 작성할 수 있습니다. 단, 이 방법은 작성하려는 파일이 대상 디렉토리에 없는 경우에만 작동합니다.
한 개의 파일에 여러 개의 diff 리스트를 넣을 수도 있지만, 관련 패치끼리 별도의 파일로 묶는 것이 좋습니다.
patch 명령은 ed 스크립트에서 행 번호가 틀렸는지 여부를 알릴 수 없으며, 변경 또는 삭제 명령 발견시 정상적인 diff 리스트의 잘못된 행 번호를 발견할 수만 있습니다. fuzz 요소 3을 사용한 문맥 diff 목록에는 동일한 회선 번호 문제점이 있을 수 있습니다. 적합한 대화식 인터페이스가 추가될 때까지 그 경우, 문맥 diff 목록을 사용하여 변경사항 정확도를 검사하십시오. 오류가 없는 컴파일은 대개 패치가 작동되었으나 이 패치가 오류가 전혀 없다는 표시는 아닙니다.
patch 명령의 결과는 패치 작성에 사용되었던 파일과 같은 버전에 패치가 적용될 때만 정확합니다.
예를 들면 코드가 복제된 경우에는 다음과 같습니다.
#ifdef
... NEWCODE
#else
... OLDCODE
# endif
patch 명령은 두 버전 모두 패치할 수 없습니다. patch 명령이 완료된 경우, 잘못된 버전이 패치되고 정상적인 종료 상태로 리턴될 수 있습니다.
파일
-b 차이점이 적용되기 전에 수정된 각각의 파일 사본을 보관합니다. 복사된 원본이 동일한 이름과 접미사 .orig로 파일됩니다. 해당 이름의 파일이 이미 있으면, 그 위에 겹쳐쓰여집니다. 여러 번의 패치가 동일한 파일에 적용되면, 최초 패치시 하나의 복사본만이 원본 파일로 구성됩니다. -o 출력 파일 플래그도 지정되면, .orig 파일이 작성되지 않습니다. 그러나 지정된 출력 파일이 이미 있으면, OutFile.orig가 작성됩니다.
-B Prefix 백업 파일 이름에 접두어를 지정합니다. 이 플래그는 -b 플래그와 같이 사용되는 경우에만 작동합니다.
-c 문맥 diff 목록(diff -c 또는 diff -C 명령의 출력)으로 패치 파일을 해석합니다. 이 플래그는 -e 또는 -n 플래그와 함께 사용할 수 없습니다.
-d Directory 처리하기 전에 현재 디렉토리를 지정된 디렉토리로 변경합니다.
-D Define 다음과 같은 C 프리프로세서 구조로 변경사항을 표시합니다.
#ifdef Define
... (NEWCODE)
#else
... (OLDCODE)
#endif /* Define */
Define 변수는 차이 기호로서 이용됩니다. 이 플래그는 diff 목록의 일반 양식 또는 문맥 양식이 패치 파일로 사용될 때만 작동합니다.
-e 패치 파일을 ed 편집기 스크립트로 해석합니다. 이 플래그는 -c 또는 -n 플래그와 함께는 사용할 수 없습니다.
-f 사용자에 대한 조회를 금지합니다. 주석을 금지하려면, -s 플래그를 사용하십시오.
-F Number 최대 fuzz 요소를 설정합니다. 이 플래그는 문맥 diff 목록에만 적용되며, 이로 인해 patch 명령은 hunk 설치 위치 판별시 지정된 행 수를 무시합니다. -F 플래그가 지정되지 않으면, 디폴트 fuzz 요소는 2입니다. 요소는 문맥 diff 목록에 있는 내용의 행 수보다 크게 설정될 수 없습니다(일반적으로 3).
주: fuzz 요소가 커지면 잘못된 패치가 발생할 가능성도 커집니다.
-i PatchFile 표준 입력이 아닌, 지정된 파일로부터 패치 정보를 읽습니다.
-l (소문자 L) diff 목록 스크립트에 있는 공백 문자열을 입력 파일의 공백 문자열과 일치하게 합니다. 다른 문자는 정확하게 일치됩니다.
-n 스크립트를 일반 diff 목록으로 해석합니다. 이 플래그는 -c 또는 -e 플래그와 함께는 사용할 수 없습니다.
-N 차이점이 이미 파일에 적용된 경우에는 패치를 무시합니다. 디폴트로, 이미 적용된 패치는 거부됩니다.
-o OutFile 패치될 파일을 복사하고, 변경사항을 적용한 다음, 수정된 버전을 지정된 출력 파일에 기록합니다. 단일 파일의 다중 패치가 이전 패치에 의해 작성된 파일의 중간 버전에 적용됩니다. 따라서 다중 패치는 출력 파일의 버전을 여러 개 뒤섞이게 만듭니다.
-p Number 경로 이름 스트라이프 계수를 설정하여, 패치 파일에서 발견되는 경로 이름이 취급되는 방법을 제어합니다. 이 플래그는 지정된 경로와 다른 디렉토리에 파일을 보관하는 경우에 유용합니다. 스트라이프 계수는 경로 이름 앞에서부터 스트라이프되는 슬래쉬의 수를 지정합니다. 끼어 들어 있는 모든 디렉토리의 이름도 스트라이프됩니다. 예를 들면 패치 파일에서 /u/leon/src/blurf1/blurf1.c를 지정했다고 가정하십시오.
-p 0는 전체 패치 이름을 수정하지 않습니다.
-p 1은 선행 슬래쉬를 제거하고, u/leon/src/blurf1/blurf1.c를 남깁니다.
-p 4는 4개의 슬래쉬와 3개의 디렉토리를 제거하고, blurf1/blurf1.c를 남깁니다.
-p 플래그가 지정되지 않으면, 기본 이름(최종 경로 이름 구성요소)만 사용됩니다. 이 플래그는 File 매개변수가 지정되지 않은 경우에만 작동됩니다.
-r RejectFile 디폴트 거부 파일 이름을 대체합니다. 디폴트 거부 파일 이름은 원래의 파일 이름에 확장자 .rej를 추가하여 구성됩니다.
-R 패치 스크립트에 반대 의미를 줍니다. 예를 들면, diff 목록이 새로운 버전에서 이전 버전 순서로 작성된 경우, -R 플래그를 사용하면 patch 명령은 각 스크립트 부분을 적용하기 전에 이를 뒤집습니다. 거부된 차이점은 스왑 형식으로 저장됩니다. -R 플래그는 역방향으로 재구성할 정보가 거의 없으므로 ed 스크립트에 사용될 수 없습니다. -R 플래그가 지정되지 않은 경우, patch 명령은 패치 파일 부분이 정상적으로 적용될 때까지 일반적인 의미 뿐만 아니라 반전된 의미로 각 부분을 적용하려고 시도합니다. 시도가 완료되면, 사용자에게 -R 플래그가 설정될지 여부를 판별하라는 프롬프트가 표시됩니다.
주: 이 방법은 최초 명령이 추가된 정상적인 diff 목록에 사용된 경우, 반전된 패치를 발견할 수 없습니다(즉, 삭제되었습니다). 널 문맥은 어디에서나 일치되므로 추가는 항상 지속됩니다. 다행히 대부분의 패치는 행을 삭제하지 않고 추가하거나 변경합니다. 따라서 대부분의 역방향은 정상 diff 목록은 삭제를 일으키고 실패합니다.
-s 오류가 발생하지 않으면 정상적으로 패치합니다.
-v 개정 헤더 및 패치 레벨을 인쇄합니다. -v 플래그가 다른 플래그와 함께 사용되면, 다른 플래그는 무시됩니다.
-x Number 내부 디버깅 플래그를 설정합니다. 이 플래그는 patch 명령 개발자 전용입니다.
종료 상태
다음과 같은 종료값을 리턴합니다.
0 성공적으로 완료되었습니다.
1 오류가 발생했습니다.
예제
difflisting 파일의 diff 리스트를 prog.c 파일에 적용하려면 다음과 같이 입력하십시오.
patch -i difflisting prog.c
prog.c 파일의 원래 버전을 저장하려면 다음과 같이 입력하십시오.
patch -b -i difflisting prog.c
이는 변경사항을 prog.c에 적용하고, prog.c의 원래 내용을 파일 prog.c.orig에 보관합니다.
원래 버전을 변경하지 않고 prog.c 파일을 패치하려면 다음과 같이 입력하십시오.
patch -i difflisting -o prog.new prog.c
여기에서는 prog.c를 소스 파일로 사용하지만, 변경된 버전은 파일 이름이 prog.new인 파일에 기록됩니다.
파일
/usr/bin/patch patch 명령을 포함하고 있습니다.
관련 정보
diff 명령, ed 명령