Mencoba mempersingkat skrip bash yang menggunakan curl untuk mengambil beberapa panggilan API membutuhkan sesuatu seperti ini:
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'
Dan gunakan dalam bentuk ini:
curl --user $USER:$PASS https://api.example.com/{foo,bar,baz} -o '#1.json'
Masalahnya adalah curl mengambil foo, bar dan baz tetapi tidak menetapkan output ke foo.json, bar.json dan baz.json. Ini benar-benar membuat #1.json dan menyalurkan output ke stdout. Telah dicoba dengan tunggal, ganda, dan tanpa tanda kutip, semua hasil yang sama.
Ini dijalankan di dalam skrip bash, meskipun perintah curl berperilaku dengan cara yang sama ketika dimasukkan langsung pada baris perintah. Apakah ini masalah sintaks OS X?
Jawaban yang Diterima:
Masalah Anda adalah bahwa {...}
ekspresinya juga sintaks shell yang valid. Misalnya, jalankan:
echo file/{one,two}
Dan Anda mendapatkan:
file/one file/two
Jadi ketika Anda menjalankan:
curl --user $USER:$PASS https://api.example.com/{foo,bar,baz} -o '#1.json'
{foo,bar,baz}
sedang ditafsirkan oleh shell your Anda , dan curl
benar-benar menerima baris perintah:
curl --user youruser:secret https://api.example.com/foo https://api.example.com/bar https://api.example.com/baz -o '#1.json'
Sejak curl
tidak melihat {...}
ekspresi, Anda tidak mendapatkan
penanganan ajaib untuk #1
. Solusinya cukup dengan melampirkan URL
dalam tanda kutip tunggal:
curl --user $USER:$PASS 'https://api.example.com/{foo,bar,baz}' -o '#1.json'
Tanda kutip tunggal menghambat ekspansi shell dari string.