
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 +H
ou executar isso a partir de um script, o bash não fará nada com o !
. Meu problema é que:
- Ocasionalmente, quero copiar e colar o script na linha de comando. Dentro de seis meses, terei esquecido essa ruga.
- 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 cat
em vez de curl
, o heredoc parecerá vazio, aliás.
Responder1
Para evitar o event not found
erro, basta usar set +H
, inclusive no script. É inofensivo e você pode adicionar um comentário explicando isso.
| read x
simplesmente 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 foo
em um subshell. Não é possível alterar variáveis no shell pai.
Use x=$(whatever)
em vez disso.