La combinación de heredoc con pipe falla

La combinación de heredoc con pipe falla

Estoy intentando iniciar sesión en una API mediante curl. Como la solicitud espera JSON, estoy usando esto:

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

...y eso está funcionando bien. Obtengo un resultado que se parece a esto:

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

Pero cuando intento capturar el resultado en una variable, no funciona.

He intentado:

x=$(curl ...)

...pero eso falla conbash: !password!: event not found

Si, mi contraseñahacecomience con un !; Esta es una instalación de prueba de la API, por lo que estoy usando una contraseña débil.

Soy consciente de que si uso set +Ho ejecuto esto desde un script, bash no hará nada con el archivo !. Mi problema es que:

  1. De vez en cuando quiero copiar y pegar el script en la línea de comando. Dentro de seis meses me habré olvidado de esta arruga.
  2. ¿Por qué bash intenta hacer esto dentro de un heredoc?

Debido a la rareza antes mencionada !, intenté canalizar los resultados a read:

(curl ...
EOF
) | read x

...pero luego destroza el heredoc de alguna manera, y el servidor responde con el equivalente a "JSON no válido".

Por cierto , si uso caten lugar de curl, el documento heredoc parece estar vacío.

Respuesta1

Para evitar el event not founderror, simplemente use set +H, incluido en el script. Es inofensivo y puedes agregar un comentario explicándolo.

| read xsimplemente no funciona; verhttp://tiswww.case.edu/php/chet/bash/FAQ, específicamente:

E4) Si canalizo la salida de un comando a `read variable', ¿por qué la salida no aparece en $variable cuando finaliza el comando de lectura?

En bash, se | fooejecuta fooen una subcapa. No puede cambiar las variables en el shell principal.

Úselo x=$(whatever) en su lugar.

información relacionada