1

Я пытаюсь войти в API, используя curl. Поскольку запрос ожидает JSON, я использую это:

curl -s -X POST -H "Content-Type: application/json" \
    $API_URL/auth -d@- <<EOF
{
  "id": "$USER@example.com",
  "password": "!password!"
}
EOF

... и это работает нормально. Я получаю результат, который выглядит примерно так:

{"access_token":"jXed...I5mQ=","expires_in":3600}

Но когда я пытаюсь записать вывод в переменную, это не работает.

Я пробовал:

x=$(curl ...)

... но с bash: !password!: event not found

Да, мой пароль действительно начинается !; это тестовая установка API, поэтому я использую слабый пароль.

Я знаю, что если я использую set +H или запускаю это из скрипта, bash ничего не сделает с ! , Моя проблема в том, что:

  1. Я иногда хочу скопировать и вставить скрипт в командную строку. Через полгода я забуду про эту морщинку.
  2. Почему Bash даже пытается сделать это внутри heredoc?

Из-за вышеупомянутых странностей с ! Я попытался read результаты вместо этого:

(curl ...
EOF
) | read x

... но затем он каким-то образом искажает heredoc, и сервер отвечает эквивалентом "неверного JSON".

Если я использую cat вместо curl , между прочим, heredoc оказывается пустым.

1 ответ1

0

Чтобы избежать ошибки « event not found , просто используйте set +H , в том числе и в скрипте. Это безвредно, и вы можете добавить комментарий, объясняющий это.

| read x просто не работает; см. http://tiswww.case.edu/php/chet/bash/FAQ, в частности:

E4) Если я перенаправляю вывод команды в `read variable ', почему вывод не отображается в $ variable, когда команда read завершается?

В Баш, | foo запускает foo в подоболочке. Он не может изменять переменные в родительской оболочке.

Вместо этого используйте x=$(whatever) .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .