목표는 복사하여 붙여 넣을 수 있는(예: 웹 포럼에 게시) bash 한 줄 명령을 만든 다음 파일을 패치하는 것입니다. 패치 파일을 복사하여 명령줄에 붙여넣어 배포하는 방법이라고 생각하세요.
소스 시스템에서:
- 패치 파일이 입력으로 사용됩니다.
- 출력을 생성하려면 다른 bash 명령을 사용해야 합니다.
현재 이 작업은 다음을 통해 수행됩니다.
$ oldifs=$IFS;printf '\n{ ';while IFS= read -r p;do printf 'echo %q; ' "$p";done < custom.patch;printf ' }\n\n';IFS=$oldifs
그러면 다음과 같은 출력이 생성됩니다.
{
...
echo \ //=\ require\ xyz.js;
echo @@\ -81\,7\ +80\,6\ @@;
echo $' \t\t\tchild.currentlyBackingUp = $(\'.dashboard-currently-backing-up\', element).dashboardBackup({type: this.type});';
...
}
이는 대상 시스템에서 한 줄 패치 명령에 대한 입력으로 사용될 수 있습니다. 예를 들면 다음과 같습니다.
patch < { echo \ //=\ require\ xyz.js; echo @@\ -81\,7\ +80\,6\ @@; ... }
지금까지는 소스 패치 파일에 앞머리( !
) 문자가 포함될 때까지 괜찮았습니다. 그런 다음 printf
다음과 같이 이스케이프된 출력을 생성합니다.
echo $' \t\t\tif (!cp.user.isMyUserQueryLimited()) {';
echo $'-\t\t\t\tif (ui.tab.name === "map-tab" && !serverEnv.queryLimited) {';
echo $' \t\t\t\tif (!hosted) {';
이와 같은 줄을 bash 명령줄에 붙여 넣으면 다음과 같은 결과가 생성됩니다.
#-bash: !cp.user.isMyUserQueryLimited: event not found
프로그래밍 방식으로 텍스트 스트림 데이터를 생성하는 방법세게 때리다기록 확장이 활성화된(histexpand=on) 다른 bash 명령 프롬프트에 붙여넣을 수 있는 명령을 통해 텍스트 데이터 스트림을 출력하기 위해 복사하고 붙여넣을 수 있는 명령은 무엇입니까?
답변1
귀하의 질문의 세부 사항 중 일부가 약간 혼란 스럽습니다. 특히 왜 echo 문을 생성하려는지 이해할 수 없습니다. 그래서 제가 오해한 것일 수도 있겠지만, 복사-붙여넣기 명령을 통해 패치를 적용하는 방법을 찾고 계시는 것 같습니다. 그렇다면 다음 방법을 사용하여 이 작업을 수행할 수 있습니다.여기 문서.
귀하의 표기법을 사용하면 다음과 같이 보일 것 같습니다.
patch <<HEREDOC
...
//= require xyz.js
@@ -81,7 +80,6 @@
child.currentlyBackingUp = $('.dashboard-currently-backing-up', element).dashboardBackup({type: this.type});
...
HEREDOC
다음은 기술을 설명하는 간단한 예입니다.
먼저 파일을 만듭니다.
cat <<HEREDOC > file-v1.txt
this is the first line
HEREDOC
이제 파일의 업데이트된 버전을 만듭니다(예: 줄 추가).
cat <<HEREDOC > file-v2.txt
this is the first line
here is a second line
HEREDOC
이제 두 파일의 패치를 계산합니다.
diff -u file-v1.txt file-v2.txt
출력은 다음과 같아야 합니다.
--- file-v1.txt 2017-10-26 09:53:58.000000000 -0500
+++ file-v2.txt 2017-10-26 09:53:58.000000000 -0500
@@ -1 +1,2 @@
this is the first line
+here is a second line
이제 명령은 다음과 같습니다.
patch file-v1.txt <<HEREDOC
--- file-v1.txt 2017-10-26 09:53:58.000000000 -0500
+++ file-v2.txt 2017-10-26 09:53:58.000000000 -0500
@@ -1 +1,2 @@
this is the first line
+here is a second line
HEREDOC
이 명령을 복사하여 터미널에 붙여넣고 실행할 수 있어야 합니다. 올바른 디렉토리에 있으면 file-v1.txt
포함된 텍스트로 업데이트됩니다.file-v2.txt
또한 heredoc은 기록 확장을 수행하지 않습니다. 다음을 확인할 수 있습니다.
cat <<HEREDOC
!!
HEREDOC