Bash가 이스케이프된 문자를 해석하는 이유는 무엇입니까? [복사]

Bash가 이스케이프된 문자를 해석하는 이유는 무엇입니까? [복사]

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"

관련 정보