Почему bash интерпретирует символы, которые у меня есть?

Почему, когда я запускаю curl против 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?

4 Solutions collect form web for “Почему bash интерпретирует символы, которые у меня есть?”

Характер расширения истории ! особенно, когда он находится между двойными кавычками, но он теряет свое особое значение между одинарными кавычками.

Здесь он находится внутри строки с "Authorization: Bearer '00DE0000000K0eM!AQYAQGgmLxxxxxxxxxxx'" . Одиночные кавычки в этой строке являются обычными символами в этой строке, они не интерпретируются специально. Здесь нет ни одной кавычки.

Если вы добавите обратную косую черту, это защитит ! от запуска расширения истории, но сама обратная косая черта остается. Таким образом, вы Authorization: Bearer '00DE0000000K0eM\!AQYAQGgmLxxxxxxxxx' в заголовок Authorization: Bearer '00DE0000000K0eM\!AQYAQGgmLxxxxxxxxx' .

Если заголовок должен быть Authorization: Bearer '00DE0000000K0eM!AQYAQGgmLxxxxxxxxx' , вы можете указать его следующим образом:

 curl https://foo.my.salesforce.com/services/data/v28.0/ -H 'Authorization: Bearer '\''00DE0000000K0eM!AQYAQGgmLxxxxxxxxxxx'\' 

Потому что вы завершаете всю строку двойными кавычками! интерпретируется (одинарные кавычки затем обрабатываются как строка, содержащаяся в двойных кавычках).

Пытаться:

 curl https://foo.my.salesforce.com/services/data/v28.0/ -H 'Authorization: Bearer '"'"'00DE0000000K0eM!AQYAQGgmLxxxxxxxxxxx'"'" 

В строке может использоваться более одной цитируемой строки. Также я использую двойные кавычки для обертывания одинарных кавычек, поэтому они рассматриваются как строка, а не маркер ограничения строки.

 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"
 aa'bb! cc'dd (Хорошо)

 bash-4.2 $ printf '% s \ n' "aa'bb" '!' "cc'dd"
 aa'bb! cc'dd (Хорошо)

То есть, удары должны быть экранированы одинарными кавычками или обратным слэшем (двойные кавычки не избегают их). Обратная косая черта в двойных кавычках предотвратит расширение истории, но обратная косая черта останется.

В этом отношении поведение bash отличается от поведения (t)csh (которое bash заимствовало эту функцию) или zsh которые удаляют эту обратную косую черту, которая была использована для выхода ! как и следовало ожидать.

Если вы никогда не используете расширение истории, вы можете также полностью отключить его, чтобы избавить вас от таких проблем:

 set +H 

! а затем … stuff .. в оболочке Bash означает вытащить значения из истории вашей оболочки. Вы можете просмотреть историю с помощью команды history . Это список команд, которые вы ранее запускали.

Чтобы отговорить оболочку от интерпретации этого символа, просто сверните свой аргумент в одинарные кавычки ( ' ) или убегите ! , В вашем случае просто избежать этого должно быть достаточно, и оставьте одиночные кавычки ( ' ).

 $ curl https://foo.my.salesforce.com/services/data/v28.0/ -H "Authorization: Bearer 00DE0000000K0eM\!AQYAQGgmLxxxxxxxxx" 
  • Дешифровать файл с помощью gpg в пакетном режиме, когда кодовая фраза включает в себя «!»?
  • Regex работает в оболочке, но не через скрипт Perl
  • Конфликт группы контекста Bash
  • "Bash:! / Bin / su": событие не найдено "
  • Почему я не могу сделать ls * .txt в подоболочке?
  • Использовать параметр в аргументе команды
  • Почему вырезать провал с bash, а не zsh?
  • Определить папку в bash
  • Необходимо установить переменную с ""
  • Почему я не могу запустить этот скрипт?
  • переменное расширение в подстановке команд над SSH bash 4.X
  • Как сопоставить строку с символами в виде grep?
  • Linux и Unix - лучшая ОС в мире.