Pokus o zkrácení bash skriptu, který používá curl k načtení více volání API, trvá něco takového:
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'
A použijte jej v této podobě:
curl --user $USER:$PASS https://api.example.com/{foo,bar,baz} -o '#1.json'
Problém je v tom, že curl načítá foo, bar a baz, ale nepřiřazuje výstup k foo.json, bar.json a baz.json. Doslova vytváří #1.json a přivádí výstup do stdout. Vyzkoušeno s jednoduchými, dvojitými a bez uvozovek, všechny výsledky jsou stejné.
Toto se spouští v bash skriptu, ačkoli příkaz curl se chová stejně, když je zadán přímo na příkazovém řádku. Je to problém se syntaxí OS X?
Přijatá odpověď:
Váš problém je, že {...}
výraz je také platná syntaxe shellu. Například spusťte:
echo file/{one,two}
A dostanete:
file/one file/two
Takže když spustíte:
curl --user $USER:$PASS https://api.example.com/{foo,bar,baz} -o '#1.json'
{foo,bar,baz}
je interpretováno vaším shell a curl
skutečně přijímá příkazový řádek:
curl --user youruser:secret https://api.example.com/foo https://api.example.com/bar https://api.example.com/baz -o '#1.json'
Od curl
nevidí {...}
výraz, nezískáte
magické zpracování pro #1
. Řešením je jednoduše uzavřít URL
do jednoduchých uvozovek:
curl --user $USER:$PASS 'https://api.example.com/{foo,bar,baz}' -o '#1.json'
Jednoduché uvozovky zabraňují jakékoli expanzi řetězce.