Я пытаюсь войти в 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 ничего не сделает с !
, Моя проблема в том, что:
- Я иногда хочу скопировать и вставить скрипт в командную строку. Через полгода я забуду про эту морщинку.
- Почему Bash даже пытается сделать это внутри heredoc?
Из-за вышеупомянутых странностей с !
Я попытался read
результаты вместо этого:
(curl ...
EOF
) | read x
... но затем он каким-то образом искажает heredoc, и сервер отвечает эквивалентом "неверного JSON".
Если я использую cat
вместо curl
, между прочим, heredoc оказывается пустым.