Der Versuch, ein Bash-Skript zu kürzen, das curl verwendet, um mehrere API-Aufrufe abzurufen, dauert ungefähr so:
curl --user $USER:$PASS https://api.example.com/foo -o 'foo.json'
curl --user $USER:$PASS https://api.example.com/bar -o 'bar.json'
curl --user $USER:$PASS https://api.example.com/baz -o 'baz.json'
Und verwenden Sie es in dieser Form:
curl --user $USER:$PASS https://api.example.com/{foo,bar,baz} -o '#1.json'
Das Problem ist, dass curl foo, bar und baz abruft, aber die Ausgabe nicht foo.json, bar.json und baz.json zuweist. Es erstellt buchstäblich #1.json und leitet die Ausgabe an stdout weiter. Wurde mit einfachen, doppelten und keinen Anführungszeichen versucht, alle mit demselben Ergebnis.
Dies wird innerhalb eines Bash-Skripts ausgeführt, obwohl sich der Curl-Befehl genauso verhält, wenn er direkt in die Befehlszeile eingegeben wird. Ist dies ein Syntaxproblem von OS X?
Akzeptierte Antwort:
Ihr Problem ist, dass der {...}
Ausdruck ist auch gültige Shell-Syntax. Führen Sie beispielsweise Folgendes aus:
echo file/{one,two}
Und Sie erhalten:
file/one file/two
Also, wenn Sie laufen:
curl --user $USER:$PASS https://api.example.com/{foo,bar,baz} -o '#1.json'
Der {foo,bar,baz}
wird von Ihrer Shell interpretiert , und curl
tatsächlich erhält die Befehlszeile:
curl --user youruser:secret https://api.example.com/foo https://api.example.com/bar https://api.example.com/baz -o '#1.json'
Seit curl
sieht den {...}
nicht Ausdruck erhalten Sie nicht die
magische Handhabung für #1
. Die Lösung besteht darin, die URL
einfach in einfache Anführungszeichen zu setzen:
curl --user $USER:$PASS 'https://api.example.com/{foo,bar,baz}' -o '#1.json'
Die einfachen Anführungszeichen verhindern jegliche Shell-Erweiterung des Strings.