尝试缩短使用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 命令的行为方式相同。这是 OS X 语法问题吗?
答案1
你的问题是{...}
表达式是还有效的 shell 语法。例如,运行:
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'
单引号禁止字符串的任何 shell 扩展。