Intentar acortar una secuencia de comandos bash que usa curl para obtener múltiples llamadas API requiere algo como esto:
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'
Y úsalo de esta forma:
curl --user $USER:$PASS https://api.example.com/{foo,bar,baz} -o '#1.json'
El problema es que curl obtiene foo, bar y baz pero no asigna la salida a foo.json, bar.json y baz.json. Literalmente está creando #1.json y canalizando la salida a la salida estándar. Se probó con comillas simples, dobles y sin comillas, todo con el mismo resultado.
Esto se está ejecutando dentro de un script bash, aunque el comando curl se comporta de la misma manera cuando se ingresa directamente en la línea de comando. ¿Se trata de un problema de sintaxis de OS X?
Respuesta aceptada:
Su problema es que el {...}
expresión es también sintaxis de shell válida. Por ejemplo, ejecute:
echo file/{one,two}
Y obtienes:
file/one file/two
Así que cuando ejecutas:
curl --user $USER:$PASS https://api.example.com/{foo,bar,baz} -o '#1.json'
El {foo,bar,baz}
está siendo interpretado por su shell y curl
en realidad recibe la línea de comando:
curl --user youruser:secret https://api.example.com/foo https://api.example.com/bar https://api.example.com/baz -o '#1.json'
Desde curl
no ve el {...}
expresión, no obtienes el
manejo mágico para #1
. La solución es simplemente encerrar la URL
entre comillas simples:
curl --user $USER:$PASS 'https://api.example.com/{foo,bar,baz}' -o '#1.json'
Las comillas simples inhiben cualquier expansión de shell de la cadena.