Объединение heredoc с pipe не удается

Объединение heredoc с pipe не удается

Я пытаюсь войти в 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 ничего не сделает с !. Моя проблема в том, что:

  1. Мне иногда хочется скопировать-вставить скрипт в командную строку. Через полгода я забуду об этой загвоздке.
  2. Почему 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) .

Связанный контент