대부분의 작업을 해결하기 위해 가끔 사용하는 정확한 명령과 요령이 기억나지 않아서 나중에 참조할 수 있도록 파일에 기록해 두려고 합니다. 내가 일반적으로 하는 일은 전체 명령을 echo에 넣고 빠르게 파일에 추가하는 것입니다.
이 방법은 항상 효과가 있었지만 다음과 같은 일이 처음 발생하면 위의 지침을 따를 수 없습니다.
성공 기록
$ echo "cat file1.txt | paste -d, - - ## Step 3 " >> ~/globalLog.txt
여기에 갇혀
$ echo "cat file2.txt | sed 's/"//g' > file3.txt ## Step 2 " >> ~/globalLog.txt
위의 내용은 따옴표가 제대로 닫히지 않았기 때문에 명백한 오류를 발생시킵니다(명령을 완료하기 위해 두 번째 명령 propmt(제 생각에는?)로 떨어짐 , 즉 제 경우에는). sed 명령은 sed 표현식에 작은따옴표( )를 PS2
사용하고 있습니다. 대체하려면 큰따옴표( )를 >_
사용하십시오 .'
"
이 경우 전체 명령을 어떻게 포함합니까?
답변1
인용을 위해 여기 문서를 완전히 사용하지 않아도 됩니다. 작은따옴표/큰따옴표(예: 아래 예의 "EOF") 안에 레이블을 설정하면 텍스트에서 변수 및 명령 평가가 비활성화됩니다.
cat <<"EOF" >>~/globalLog.txt
cat file2.txt | sed 's/"//g' > file3.txt ## Step 2
EOF
답변2
여러 가지 옵션이 있으며 각 옵션은 다양한 상황에서 편리합니다.
전체 문자열을 큰따옴표로 처리하고 내부의 리터럴 큰따옴표를 이스케이프 처리합니다(그런 항목이 하나만 있으면 읽기가 더 쉽지만 아마도 다음과 같은 결과가 나올 것입니다).울타리):
echo "cat file2.txt | sed 's/\"//g' > file3.txt ## Step 2 " >> ~/globalLog.txt
문자열의 다른 부분에 대해 다른 따옴표를 사용하십시오.
echo "cat file2.txt | sed 's/"'"'"//g' > file3.txt ## Step 2 " >> ~/globalLog.txt
echo
여러 매개변수를 처리하는 기능을 사용합니다 . 하나만 있으면 작동합니다.단어결과에는 일반적으로 각 인수 사이에 공백이 있으므로 문제가 있는 문자가 포함되어 있으므로 문자열에서 작동하지 않습니다. 대체 예:echo 'foo"' "'bar"
인쇄
foo" 'bar
여러
echo -n
문(또는printf %s
)을 사용하고 뒤에는echo
없이 다음을 사용하세요-n
.echo -n "cat file2.txt | sed '" >> ~/globalLog.txt echo -n 's/"' >> ~/globalLog.txt echo "//g' > file3.txt ## Step 2 " >> ~/globalLog.txt
따옴표를 전혀 사용하지 말고 모든 특수 문자를 이스케이프 처리하세요.
echo cat\ file2.txt\ \ \|\ sed\ \'s/\"//g\'\ \>\ file3.txt\ \#\#\ Step\ 2\ >> ~/globalLog.txt
알아채다작은따옴표로 묶인 문자열에서는 작은따옴표를 이스케이프 처리할 수 없습니다..
만약에 의심이된다면,더 많은 인용문 사용™.
그러나 귀하의 경우에는 명령을 실행하기 전에 명령을 기록한 것으로 보입니다. 이미 아주 좋은 해결책이 있습니다명령을 텍스트로 사용.
답변3
간단하고 체계적이며 POSIX 규격을 준수하는 인용 방법이 있습니다.어느끈. 다음 두 가지 규칙만 기억하면 됩니다.
- 다음과 같이 백슬래시를 사용하여 아포스트로피(작은따옴표)를 인용합니다.
\'
- 다음과 같이 아포스트로피를 아포스트로피로 묶어 아포스트로피를 제외한 모든 내용을 인용합니다.
'printf "foo\n"'
이러한 규칙이 어떻게 함께 사용되는지 설명하기 위해 don't
다음과 같이 단어를 체계적으로 인용할 수 있습니다.'don'\''t'
일반적으로 문자열을 참조하는 더 읽기 쉬운 방법을 찾을 수 있지만 상황이 복잡해지면 필요한 참조를 얻는 신뢰할 수 있는 방법입니다.
질문에 인용된 문자열 형식은 다음과 같습니다.
$ echo 'cat file2.txt | sed '\''s/"//g'\'' > file3.txt ## Step 2 ' >> ~/globalLog.txt
답변4
오직
$ cat >> ~/globalLog.txt
<now type your command>
echo "cat file2.txt | sed 's/"//g' > file3.txt ## Step 2 "
<hit ctrl-d>