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'