
Я пытаюсь войти в API, используя curl. Поскольку запрос ожидает JSON, я использую это:
curl -s -X POST -H "Content-Type: application/json" \
$API_URL/auth -d@- <<EOF
{
"id": "[email protected]",
"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 оказывается пустым.
решение1
Чтобы избежать event not found
ошибки, просто используйте set +H
, включая в скрипт. Это безвредно, и вы можете добавить комментарий, поясняющий это.
| read x
просто не работает; см.http://tiswww.case.edu/php/chet/bash/FAQ, конкретно:
E4) Если я передаю вывод команды в `переменную чтения', почему вывод не отображается в $variable после завершения команды чтения?
В bash он | foo
запускается foo
в подоболочке. Он не может изменять переменные в родительской оболочке.
Вместо этого используйте x=$(whatever)
.