curlを使用して複数のAPI呼び出しをフェッチするbashスクリプトを短縮しようとすると、次のようになります。
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'
そして、この形式で使用します:
curl --user $USER:$PASS https://api.example.com/{foo,bar,baz} -o '#1.json'
問題は、curlがfoo、bar、bazをフェッチしているが、出力をfoo.json、bar.json、baz.jsonに割り当てていないことです。文字通り#1.jsonを作成し、出力をstdoutにパイプします。一重引用符、二重引用符、引用符なしですべて同じ結果が試されました。
これはbashスクリプト内で実行されていますが、curlコマンドはコマンドラインで直接入力した場合と同じように動作します。これはOSX構文の問題ですか?
承認された回答:
あなたの問題は、{...}
式はまたです 有効なシェル構文。たとえば、次のコマンドを実行します:
echo file/{one,two}
そして、あなたは得る:
file/one file/two
したがって、実行すると:
curl --user $USER:$PASS https://api.example.com/{foo,bar,baz} -o '#1.json'
{foo,bar,baz}
シェルによって解釈されます 、およびcurl
実際にコマンドラインを受け取ります:
curl --user youruser:secret https://api.example.com/foo https://api.example.com/bar https://api.example.com/baz -o '#1.json'
curl
以降 {...}
が表示されない 式、
#1
の魔法の処理は受けられません 。解決策は、URLを
一重引用符で囲むことです:
curl --user $USER:$PASS 'https://api.example.com/{foo,bar,baz}' -o '#1.json'
一重引用符は、文字列のシェル拡張を禁止します。