Die Kombination von Heredoc mit Pipe schlägt fehl

Die Kombination von Heredoc mit Pipe schlägt fehl

Ich versuche, mich mit curl bei einer API anzumelden. Da die Anfrage JSON erwartet, verwende ich Folgendes:

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

...und das funktioniert gut. Ich erhalte ein Ergebnis, das ungefähr so ​​aussieht:

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

Aber wenn ich versuche, die Ausgabe in einer Variablen zu erfassen, funktioniert es nicht.

Ich habe es versucht:

x=$(curl ...)

...aber das schlägt fehl mitbash: !password!: event not found

Ja, mein PassworttutBeginnen Sie mit einem !; dies ist eine Testinstallation der API, daher verwende ich ein schwaches Passwort.

Mir ist bewusst, dass set +HBash nichts mit dem macht, wenn ich dies verwende oder über ein Skript ausführe !. Mein Problem ist, dass:

  1. Ich möchte das Skript gelegentlich in die Befehlszeile kopieren und einfügen. In sechs Monaten werde ich dieses Problem vergessen haben.
  2. Warum versucht Bash überhaupt, dies in einem Heredoc zu tun?

Aufgrund der oben erwähnten Merkwürdigkeiten mit !habe ich versucht, die Ergebnisse readstattdessen an Folgendes weiterzuleiten:

(curl ...
EOF
) | read x

...aber dann verstümmelt es irgendwie das Heredoc und der Server antwortet mit dem Äquivalent von „ungültiges JSON“.

Wenn ich catanstelle von verwende curl, scheint das Heredoc übrigens leer zu sein.

Antwort1

Um den event not foundFehler zu vermeiden, verwenden Sie einfach set +H, including im Skript. Das ist harmlos und Sie können einen Kommentar hinzufügen, der es erklärt.

| read xfunktioniert einfach nicht; siehehttp://tiswww.case.edu/php/chet/bash/FAQ, und zwar:

E4) Wenn ich die Ausgabe eines Befehls in „Variable lesen“ weiterleite, warum wird die Ausgabe dann nicht in „$variable“ angezeigt, wenn der Lesebefehl abgeschlossen ist?

In Bash wird es in einer Untershell | fooausgeführt foo. Variablen in der übergeordneten Shell können nicht geändert werden.

Verwenden Sie x=$(whatever) stattdessen.

verwandte Informationen