bash에서는 어떻게 느낌표를 벗어나나요?


172

나는 뭔가를하고 싶다. bzr commit -m "It works!". 나는 일을함으로써 감탄 부호를 피할 수있다. bzr commit -m "It works\!". 그러나 커밋 메시지에는 백 슬래시가 포함됩니다. 역 슬래시를 무시하면서 느낌표를 벗어나는 방법은 무엇입니까?


1
하기 bzr commit -m "It works"! 작동합니다.
kba

1
내가 명령을 내리기 전에 실제로 말한대로 실제로 작동합니다. :) bzr commit -m "It works!"
h4unt3r


허용 된 대답은 커밋 문제에 대한 좋은 해결 방법이지만 실제 문제에 대한 대답은 아니라고 생각합니다. 강타 역사 확장 . Dennis의 답변을 수락하는 것을 고려해주십시오.
Arjan

답변:


144

커밋 메시지에서 변수를 확장하기 위해 bash에 의존하지 않으므로 대신 작은 따옴표를 사용할 수 있습니다. 작은 따옴표로 묶은 문자열은 bash에 의해 확장되지 않습니다.

bzr commit -m 'This does work!' 

23
질문은 "느낌표를 어떻게 피할 수 있습니까?"였습니다. "느낌표를 확장하지 않는 방법은 무엇입니까?" 나는 이것이 유효하다고 생각하지 않는다. 아포스트로피와 느낌표를 동일한 명령 줄에 전달할 때와 같이 작동하지 않는 경우가 있습니다. 아래 답변은 많은 사람들이 필요로하는 것을 수행하는 데 훨씬 효과적입니다.
Jann

7
@ Jann : 당신은 100 % 맞습니다.하지만 수퍼 유저에 대한 질문이 많은 것은 여기에 있습니다. 우리는 질문에 대한 답을 구합니까? 아니면 사람들이 특정 문제를 해결하도록 도울 것입니다. 두 가지 방법 모두 유용 할 수 있다고 생각하며 특정 문제에 대한 도움을 찾고있었습니다.
Benjamin Bannier

감동! 이것은 특정한 문제였습니다. 나는 많은 경우에 사용할 수있는 나의 질문에 대한 답을 원한다. pS : 내가 언급 한 이유는 perl 프로그램에 아포스트로피와 느낌표를 모두 전달해야했기 때문에 나는 아래의 해결책이 필요했다. :)
Jann

나는 Benjamin과 Jann 모두에게 동의하지만 downvote를 주었다. 그 질문의 제목은 검색 엔진에 의해 색인이 붙여지며, 그것이 제가 여기에 왔던 방법입니다. 아마 대부분의 사용자가 여기에 올 것입니다. 그래서 실제 질문이 그 문제를 반영하는 것이 중요하다고 생각하는 이유입니다. 다른 포럼에서 사람들은 자신이 원하는 것을 정확히 물어볼 것을 권고합니다. 잘못 표현 된 질문에 답하는 것은 어리 석음을 지원하며 그것이 바로 내 downvote의 정확한 이유입니다. 타협 / 해결책으로서 제 제안은 표제를 실제 문제를 반영하도록 적응시키는 것입니다.
ChristophK

146

느낌표와 함께 큰 따옴표를 사용하려는 경우 다음과 같은 또 다른 방법이 있습니다.

echo "It's broken"'!'

이것은 ! 선의 끝에 있지 않습니다.

예를 들면 :

echo "hello there"'!'" and goodbye"

보너스 : 유사한 기술을 사용하여 탈출 할 수 있습니다. 어떤 Sh 또는 Bash의 텍스트 (sed의 도움으로) :의 첫 번째 옵션을 참조하십시오. 이 대답 . 또한, bash-completion 설치되어있을 가능성이 있습니다. 그만큼 quote() 기능 이미 사용할 수 있습니다.


4
좋은 팁, JWD. 나는 bash 문자열이 그들 사이의 공백을 생략함으로써 연결될 수 있다는 것을 깨닫지 못했습니다.
Alan H.

사실 느낌표가 문자열 끝 부분에 있으면 분명히 나타납니다. echo "Happy birthday!" 그렇지 않으면 백 슬래시로 이스케이프 처리 할 수 ​​있지만 백 슬래시도 인쇄됩니다. XD 배쉬는 희미한 하트가 아닙니다.
h4unt3r

@ h4unt3r : Strange, 그건 내 경험이 아니야. 나를 위해, echo "Happy Birthday!" 2 라인을 출력합니다. 첫 번째는 echo "Happy birthday" (느낌표 없음), 두 번째는 "생일 축하합니다"(다시 느낌표 없음)입니다. 이 테스트를 할 때 기록 확장 기능이 켜져 있습니까?
jwd

@ jwd 어떤 버전의 bash를 실행하고 있습니까? 나는 항상 히스토리 확장 기능을 가지고있다. 실수로 2 개를 사용 했습니까 !! 너 시험을 위해서?
h4unt3r

@ h4unt3r : version 4.1.2(1)-release (x86_64-redhat-linux-gnu), 확실히 단 하나 ! 사용되고있다. 나는 가지고있다 histexpand 선물 $SHELLOPTS. 그러나, 나는 다른 컴퓨터에서 4.3.18 (2) -release를 시도했지만 설명대로 행동한다. 버그가 수정 된 것 같습니다.
jwd

64

끄다 역사 확장 :

set +H

또는

set +o histexpand

해당 명령 중 하나를 명령에 추가 할 수 있습니다. ~/.bashrc 일반적으로 히스토리 확장을 사용하지 않는 경우.

Bash 4.3에 a가 추가되었습니다. 특별한 상황 :

역사 확장 문자는 큰 따옴표로 묶인 문자열에서 닫는 큰 따옴표 바로 앞에 오는 경우 따옴표로 처리됩니다


고마워요. -이 방법이 효과가 있었지만해야했습니다. set +o histexpand, 아니라 set -o histexpand. 이 문제를 해결하기 위해 답을 수정할 수 있습니까?
Matthew

죄송합니다. 오, 죄송합니다. 결정된.
Dennis Williamson

우수한! AGES를 위해 이것을 찾고있었습니다 .... vmas 탈출구는 작동하지 않을 것입니다 ... 나는 작은 따옴표도 사용하고 싶지 않습니다 ... 나는 이것을 내 .bashrc 쓰라 구 !! ! 스크립트와 아무것도! 항상 골치 아팠다.
Aquarius Power

너무 굉장해! echo "@AquariusPower!"
joehanna

10

큰 따옴표 ( ") 대신 작은 따옴표 ( ')를 사용하십시오. 작은 따옴표는 물건의 모든 해석을 해제하고 큰 따옴표는 일부만 해제합니다.

bzr commit -m 'It works!'

4

방금 다른 방법을 찾았습니다. echo 느낌표를 사용하여 구두점을 표시하려는 문장 (문장)을 선택하십시오. 그것은 Bash 히스토그램 (histexpand)을 중심으로 다소 차이가 있으며 코드 작성에 조금 더 오래 걸립니다.

목록에있는 느낌표의 16 진수입니다. http://www.ascii-code.com/ , 21입니다. \x21 당신의 끈의 끝에, echo -e $foo, 만들다 $foo 자체 확장 된 반향 [ie, foo=$(echo -e "$foo") ], 당신이 얻을 때 당신이 얻는 것 echo $foo 다시 문자열이 있습니다. ! 결국. 그리고 전환 histexpand도.

Bash 4+에서 확실히 작동합니다. 이전 버전, ymmv.


흠 날 위해 작동하지 않습니다.
lzap

나는 당신이 자기 자신을 울리는 것에 대해 말하는 것을 얻지 못합니다. 'echo -e'와 'printf'는 이스케이프 된 8 진수, 16 진수 및 유니 코드 코드를 해석합니다. 이 중 하나를 사용하는 경우에는 "\ 041"( "!"의 경우 8 진수) 또는 "\ x21"(16 진수)를 느낌표로 사용할 수 있습니다. 예 : printf "OMG\041". 에코 또는 printf가 아닌 큰 따옴표로 묶인 문자열을 작성하는 경우 OP에서 묻는 커밋 문자열처럼 embed 할 수 있습니다. $(echo -e "\041") 느낌표가 있어야하는 문자열에. 이렇게 : bzr commit -m "This is a great commit$(echo -e "\041")".
Todd Walton
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.