Essayer de raccourcir un script bash qui utilise curl pour récupérer plusieurs appels d'API prend quelque chose comme ceci :
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'
Et utilisez-le sous cette forme :
curl --user $USER:$PASS https://api.example.com/{foo,bar,baz} -o '#1.json'
Le problème est que curl récupère foo, bar et baz mais n'attribue pas la sortie à foo.json, bar.json et baz.json. Il crée littéralement #1.json et dirige la sortie vers stdout. A été essayé avec des guillemets simples, doubles et sans guillemets, tous les mêmes résultats.
Ceci est exécuté dans un script bash, bien que la commande curl se comporte de la même manière lorsqu'elle est entrée directement sur la ligne de commande. Est-ce un problème de syntaxe OS X ?
Réponse acceptée :
Votre problème est que le {...}
l'expression est aussi syntaxe shell valide. Par exemple, exécutez :
echo file/{one,two}
Et vous obtenez :
file/one file/two
Ainsi, lorsque vous exécutez :
curl --user $USER:$PASS https://api.example.com/{foo,bar,baz} -o '#1.json'
Le {foo,bar,baz}
est interprété par votre shell , et curl
reçoit réellement la ligne de commande :
curl --user youruser:secret https://api.example.com/foo https://api.example.com/bar https://api.example.com/baz -o '#1.json'
Depuis curl
ne voit pas le {...}
expression, vous n'obtenez pas
la manipulation magique pour #1
. La solution consiste simplement à placer l'URL
entre guillemets simples :
curl --user $USER:$PASS 'https://api.example.com/{foo,bar,baz}' -o '#1.json'
Les guillemets simples empêchent toute expansion du shell de la chaîne.