
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 +H
o ejecuto esto desde un script, bash no hará nada con el archivo !
. Mi problema es que:
- 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.
- ¿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 cat
en lugar de curl
, el documento heredoc parece estar vacío.
Respuesta1
Para evitar el event not found
error, simplemente use set +H
, incluido en el script. Es inofensivo y puedes agregar un comentario explicándolo.
| read x
simplemente 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 | foo
ejecuta foo
en una subcapa. No puede cambiar las variables en el shell principal.
Úselo x=$(whatever)
en su lugar.