Combinando heredoc com pipe falha

1

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

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 recebo um resultado parecido com isto:

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

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

Eu tentei:

x=$(curl ...)

... mas isso falha com bash: !password!: event not found

Sim, minha senha começa com ! ; 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 ! . Meu problema é que:

  1. Às vezes, eu quero copiar e colar o script na linha de comando. Dentro de seis meses, esqueci dessa ruga.
  2. Por que o bash está tentando fazer isso dentro de um heredoc?

Devido à estranheza mencionada acima com ! , tentei enviar os resultados para read :

(curl ...
EOF
) | read x

... mas depois manipula o heredoc de alguma forma, e o servidor responde com o equivalente de "JSON inválido".

Se eu usar cat em vez de curl , o heredoc parece estar vazio, por acaso.

    
por Roger Lipscombe 09.06.2018 / 14:31

1 resposta

0

Para evitar o erro event not found , use apenas set +H , inclusive no script. É inofensivo e você pode adicionar um comentário explicando isso.

| read x simplesmente não funciona; veja link , especificamente:

E4) If I pipe the output of a command into 'read variable', why doesn't the output show up in $variable when the read command finishes?

No bash, o | foo executa foo em um subshell. Não é possível alterar variáveis no shell pai.

Use x=$(whatever) em vez disso.

    
por 09.06.2018 / 18:29

Tags