bash에 느낌표 (!)를 사용할 수 없습니까? : curl -v “http://example.org/!287s87asdjh2/somepath/someresource” 콘솔은로 응답합니다 bash:

curl 명령을 사용하여 !경로에 느낌표 ( )가 있는 http URL에 액세스하려고 합니다. 예 :

curl -v "http://example.org/!287s87asdjh2/somepath/someresource"

콘솔은로 응답합니다 bash: ... event not found.

무슨 일이야? 느낌표를 피하기위한 적절한 구문은 무엇입니까?



답변

느낌표는 bash에서 히스토리 확장의 일부입니다. 그것을 사용하려면 작은 따옴표 (예 :)로 묶 'http://example.org/!132'거나 \문자 앞에 백 슬래시 ( ) 로 직접 이스케이프해야 합니다 (예 🙂 "http://example.org/\!132".

큰 따옴표에서 느낌표 앞의 백 슬래시는 기록 확장을 방지하지만 이러한 경우 백 슬래시는 제거되지 않습니다. 따라서 작은 따옴표를 사용하는 것이 좋습니다 curl. 따라서 URL의 일부로 리터럴 백 슬래시를 전달하지 않습니다 .


답변

Daniel이 제공 한 답변뿐만 아니라와 함께 사용하지 않는 경우 내역 확장을 사용 중지 할 수도 있습니다 set +H.


답변

나는 작은 따옴표를 개인적으로 할 것이나, 완전성, 나는 또한이 URL이기 때문에, 당신은 인코딩 할 수 있습니다 것 !등을 %21예를 들어, curl -v http://example.org/%21132.


답변

이것은 또한 할 수 있습니다

curl -v "http://example.org/"'!'"287s87asdjh2/somepath/someresource"
또는
curl -v "http://example.org/"\!"287s87asdjh2/somepath/someresource"

bash는 인접한 문자열을 연결하기 때문에 작동합니다. 이 방법은 쉘 확장이 필요한 다른 것들이있을 때 특히 유용하므로 전체 문자열에 작은 따옴표를 사용할 수 없습니다 :

curl -v 'http://example.org/!'"287s87asdjh2/${basepath}/someresource"

!문자는 명령 행 프롬프트에서 히스토리 확장에 사용됩니다.
따라서 이것은 프롬프트에서는 문제가 될 수 있지만 쉘 스크립트 파일에서는 문제가되지 않습니다.
역사 확장은 큰 따옴표로도 작동합니다.


답변

나는 같은 문제를 겪었고 간단한 해결책은 변수를 사용하는 것이 었습니다.

E=!  
curl -v "http://example.org/${E}287s87asdjh2/somepath/someresource"

여기서 간단 함은 (1) 쉘과 명령에서 이식 가능합니다. (2) 이스케이프 구문과 ASCII 코드를 알 필요가 없습니다.


답변

Bash 4.3 이후로 이제 큰 따옴표를 사용하여 내역 확장 문자를 인용 할 수 있습니다.

$ bash --version
GNU bash, version 4.3...
[...]
$ echo "Hello World!"
Hello World!


답변

Windows에서 git bash를 사용하는 사람들에게는 @DanielPittman의 대답이 작동합니다. 그러나 백 슬래시 (\)를 슬래시 (/)로 바꾸어야합니다.

예를 들어, 유닉스에서는 다음과 같이 보일 것입니다.

curl https://abc.com/services -H 'Authorization: Bearer 111A80BBZZCnS\!ZR412543s'

Windows의 경우 다음과 같습니다 (권한 헤더 부분의 슬래시에 초점)

curl https://abc.com/services -H 'Authorization: Bearer 111A80BBZZCnS/!ZR412543s'