REST API에 대해 컬을 실행할 때 쉘이 키의 특수 문자(!)를 해석하는 이유는 무엇입니까?
curl https://foo.my.salesforce.com/services/data/v28.0/ -H "Authorization: Bearer '00DE0000000K0eM!AQYAQGgmLxxxxxxxxxxx'"
-bash: !AQYAQGgmLxxxxxxxxxx'": event not found
~에 따르면이것, 작은따옴표를 사용하면 bash가 문자열을 해석하지 못하게 됩니다.
해결 방법으로 \ 문자를 사용해 보았지만 이로 인해 키가 거부되었습니다.
curl https://foo.my.salesforce.com/services/data/v28.0/ -H "Authorization: Bearer '00DE0000000K0eM\!AQYAQGgmLxxxxxxxxx'"
[{"message":"Session expired or invalid","errorCode":"INVALID_SESSION_ID"}]
bash가 이 문자열을 해석하지 못하도록 하려면 어떻게 해야 합니까?
답변1
기록 확장 문자는 !
큰따옴표 사이에서도 특별하지만 작은따옴표 사이에서는 특별한 의미를 잃습니다.
여기서는 큰따옴표로 묶인 string 안에 있습니다 "Authorization: Bearer '00DE0000000K0eM!AQYAQGgmLxxxxxxxxxxx'"
. 이 문자열의 작은따옴표는 이 문자열의 일반 문자이며 특별히 해석되지 않습니다. 여기에는 작은따옴표로 묶인 문자열이 없습니다.
백슬래시를 추가하면 !
기록 확장이 트리거되지 않지만 백슬래시 자체는 그대로 유지됩니다. 그래서 당신은 header 로 끝납니다 Authorization: Bearer '00DE0000000K0eM\!AQYAQGgmLxxxxxxxxx'
.
헤더가 필요한 경우 Authorization: Bearer '00DE0000000K0eM!AQYAQGgmLxxxxxxxxx'
다음과 같이 지정할 수 있습니다.
curl https://foo.my.salesforce.com/services/data/v28.0/ -H 'Authorization: Bearer '\''00DE0000000K0eM!AQYAQGgmLxxxxxxxxxxx'\'
답변2
전체 문자열을 큰따옴표로 묶었기 때문입니다!예해석(작은따옴표는 큰따옴표가 포함된 문자열로 처리됩니다).
노력하다:
curl https://foo.my.salesforce.com/services/data/v28.0/ -H 'Authorization: Bearer '"'"'00DE0000000K0eM!AQYAQGgmLxxxxxxxxxxx'"'"
한 줄에 여러 개의 인용 문자열을 사용할 수 있습니다. 또한 문자열 경계 표시자가 아닌 문자열로 처리되도록 큰따옴표를 사용하여 작은따옴표를 묶었습니다.
답변3
bash-4.2$ printf '%s\n' "aa'bb!cc'dd" bash: !cc'dd": 이벤트를 찾을 수 없습니다(안좋다) bash-4.2$ printf '%s\n' "aa'bb\!cc'dd" aa'bb\!cc'dd(안좋다) bash-4.2$ printf '%s\n' "aa'bb"\!"cc'dd" 으아아앙!cc'dd(좋아요) bash-4.2$ printf '%s\n' "aa'bb"'!'"cc'dd" 으아아앙!cc'dd(좋아요)
즉, 폭발은 작은따옴표나 백슬래시로 이스케이프해야 합니다(큰따옴표는 이스케이프되지 않습니다). 큰따옴표 안의 백슬래시는 기록 확장을 방지하지만 백슬래시는 유지됩니다.
이 점에서 bash
동작은 (t)csh
예상 대로 이스케이프에 사용되는 백슬래시를 차용 bash
하거나 제거하는 것과 다릅니다.zsh
!
기록 확장을 전혀 사용하지 않는 경우 완전히 비활성화하여 이 문제를 피할 수도 있습니다.
set +H
답변4
다음 !
은...물건..Bash 쉘에서는 쉘 기록에서 값을 추출하는 것을 의미합니다. 명령을 사용하여 기록을 볼 수 있습니다 history
. 이전에 실행한 명령 목록입니다.
쉘이 이 문자를 해석하지 못하게 하려면 인수를 작은따옴표( '
)로 묶거나 이스케이프 처리하면 됩니다 !
. 이스케이프 처리하고 작은따옴표( '
)를 제거하면 됩니다.
$ curl https://foo.my.salesforce.com/services/data/v28.0/ -H "Authorization: Bearer 00DE0000000K0eM\!AQYAQGgmLxxxxxxxxx"