Combinar heredoc com pipe falha

Combinar heredoc com pipe falha

Estou tentando fazer login em uma API usando curl. Como a solicitação espera JSON, estou usando isto:

curl -s -X POST -H "Content-Type: application/json" \
    $API_URL/auth -d@- <<EOF
{
  "id": "[email protected]",
  "password": "!password!"
}
EOF

... e está funcionando bem. Eu obtenho um resultado parecido com este:

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

Mas quando tento capturar a saída em uma variável, não funciona.

Eu tentei:

x=$(curl ...)

...mas isso falha combash: !password!: event not found

Sim, minha senhafazcomece com um !; esta é uma instalação de teste da API, então estou usando uma senha fraca.

Estou ciente de que se eu usar set +Hou executar isso a partir de um script, o bash não fará nada com o !. Meu problema é que:

  1. Ocasionalmente, quero copiar e colar o script na linha de comando. Dentro de seis meses, terei esquecido essa ruga.
  2. Por que o bash está tentando fazer isso dentro de um heredoc?

Por causa da estranheza acima mencionada !, tentei canalizar os resultados para read:

(curl ...
EOF
) | read x

... mas então ele altera o heredoc de alguma forma e o servidor responde com o equivalente a "JSON inválido".

Se eu usar catem vez de curl, o heredoc parecerá vazio, aliás.

Responder1

Para evitar o event not founderro, basta usar set +H, inclusive no script. É inofensivo e você pode adicionar um comentário explicando isso.

| read xsimplesmente não funciona; verhttp://tiswww.case.edu/php/chet/bash/FAQ, especificamente:

E4) Se eu canalizar a saída de um comando para 'variável de leitura', por que a saída não aparece em $variável quando o comando de leitura termina?

No bash, ele | fooé executado fooem um subshell. Não é possível alterar variáveis ​​no shell pai.

Use x=$(whatever) em vez disso.

informação relacionada