GNU/Linux >> Linux の 問題 >  >> Linux

Curl Outfile変数がBashスクリプトで機能しませんか?

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'

一重引用符は、文字列のシェル拡張を禁止します。


Linux
  1. Bashスクリプト(I)

  2. このスクリプトを理解できません。バッシュ?

  3. Bash スクリプト - Hello World の例

  1. Bash スクリプトは、空の行に Command Not Found を出力します

  2. Bash ループのカウンター インクリメントが機能しない

  3. アトミック作成ファイルが存在しない場合は、bash スクリプトから

  1. Ubuntu Python シバン行が機能しない

  2. TERM 環境変数が設定されていません

  3. SLURM sbatch スクリプト内で Bash 変数を使用する