Почему 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?

  • Как я могу grep для строки, содержащей метасимволы регулярных выражений, такие как $ и?
  • grep: Синтаксическая ошибка возле неожиданного токена `('
  • Команда Shell работает локально, но не получается правильно разобрать ssh
  • Возможно ли избежать кавычек в кавычках эвакуации в кавычках эвакуации в кавычках эвакуации?
  • Почему эта команда не работает, как я ожидаю?
  • Почему подстановка командной строки здесь считается одной строкой?
  • Подстановочные знаки для файловых путей не работают в grep
  • разница между «..» и «..», когда я использую ssh usr @ ip 'pscp ...'
  • 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" 
    Linux и Unix - лучшая ОС в мире.