curl outfile variable não está funcionando no script bash

3

A tentativa de encurtar um script bash que usa o curl para buscar várias chamadas de API é algo assim:

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 use-o desta forma:

curl --user $USER:$PASS https://api.example.com/{foo,bar,baz} -o '#1.json'

A questão é que o curl está buscando foo, bar e baz mas não está atribuindo a saída para foo.json, bar.json e baz.json. Está literalmente criando saída # 1.json e piping para stdout. Foi tentado com single, double e sem cotações, todo mesmo resultado. Isso está sendo executado dentro de um script bash, embora o comando curl se comporte da mesma maneira quando inserido diretamente na linha de comando. Este é um problema de sintaxe do OS X?

    
por Chase 17.04.2016 / 22:53

1 resposta

9

Seu problema é que a expressão {...} é também sintaxe de shell válida. Por exemplo, execute:

echo file/{one,two}

E você recebe:

file/one file/two

Então, quando você corre:

curl --user $USER:$PASS https://api.example.com/{foo,bar,baz} -o '#1.json'

O {foo,bar,baz} está sendo interpretado pelo seu shell , e curl na verdade recebe a linha de comando:

  curl --user youruser:secret https://api.example.com/foo https://api.example.com/bar https://api.example.com/baz -o '#1.json'

Como curl não vê a expressão {...} , você não recebe o manipulação mágica para #1 . A solução é simplesmente incluir o URL entre aspas simples:

curl --user $USER:$PASS 'https://api.example.com/{foo,bar,baz}' -o '#1.json'

As aspas simples inibem qualquer expansão de shell da string.

    
por 17.04.2016 / 23:10