
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 +H
Bash nichts mit dem macht, wenn ich dies verwende oder über ein Skript ausführe !
. Mein Problem ist, dass:
- Ich möchte das Skript gelegentlich in die Befehlszeile kopieren und einfügen. In sechs Monaten werde ich dieses Problem vergessen haben.
- Warum versucht Bash überhaupt, dies in einem Heredoc zu tun?
Aufgrund der oben erwähnten Merkwürdigkeiten mit !
habe ich versucht, die Ergebnisse read
stattdessen 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 cat
anstelle von verwende curl
, scheint das Heredoc übrigens leer zu sein.
Antwort1
Um den event not found
Fehler 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 x
funktioniert 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 | foo
ausgeführt foo
. Variablen in der übergeordneten Shell können nicht geändert werden.
Verwenden Sie x=$(whatever)
stattdessen.