Il tentativo di abbreviare uno script bash che utilizza curl per recuperare più chiamate API richiede qualcosa del genere:
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'
E usalo in questo modulo:
curl --user $USER:$PASS https://api.example.com/{foo,bar,baz} -o '#1.json'
Il problema è che curl sta recuperando foo, bar e baz ma non assegna l'output a foo.json, bar.json e baz.json. Sta letteralmente creando #1.json e piping l'output su stdout. È stato provato con virgolette singole, doppie e senza virgolette, tutti gli stessi risultati.
Viene eseguito all'interno di uno script bash, sebbene il comando curl si comporti allo stesso modo quando viene immesso direttamente sulla riga di comando. È un problema di sintassi di OS X?
Risposta accettata:
Il tuo problema è che il {...}
espressione è anche sintassi della shell valida. Ad esempio, esegui:
echo file/{one,two}
E ottieni:
file/one file/two
Quindi, quando corri:
curl --user $USER:$PASS https://api.example.com/{foo,bar,baz} -o '#1.json'
Il {foo,bar,baz}
viene interpretato dalla tua shell e curl
riceve effettivamente la riga di comando:
curl --user youruser:secret https://api.example.com/foo https://api.example.com/bar https://api.example.com/baz -o '#1.json'
Dal momento che curl
non vede il {...}
espressione, non ottieni la
gestione magica per #1
. La soluzione è semplicemente racchiudere l'URL
tra virgolette singole:
curl --user $USER:$PASS 'https://api.example.com/{foo,bar,baz}' -o '#1.json'
Le virgolette singole inibiscono qualsiasi espansione della shell della stringa.