histexpand와 동일한 bash 셸에 붙여넣을 수 있는 소스 텍스트 파일을 정확하게 모방하는 출력을 생성하는 bash 명령을 생성하려면 어떻게 해야 합니까?

histexpand와 동일한 bash 셸에 붙여넣을 수 있는 소스 텍스트 파일을 정확하게 모방하는 출력을 생성하는 bash 명령을 생성하려면 어떻게 해야 합니까?

목표는 복사하여 붙여 넣을 수 있는(예: 웹 포럼에 게시) bash 한 줄 명령을 만든 다음 파일을 패치하는 것입니다. 패치 파일을 복사하여 명령줄에 붙여넣어 배포하는 방법이라고 생각하세요.

소스 시스템에서:

  1. 패치 파일이 입력으로 사용됩니다.
  2. 출력을 생성하려면 다른 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

관련 정보