GNU/Linux >> Znalost Linux >  >> Linux

Proměnná Curl Outfile nefunguje ve skriptu Bash?

Pokus o zkrácení bash skriptu, který používá curl k načtení více volání API, trvá něco takového:

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'

A použijte jej v této podobě:

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

Problém je v tom, že curl načítá foo, bar a baz, ale nepřiřazuje výstup k foo.json, bar.json a baz.json. Doslova vytváří #1.json a přivádí výstup do stdout. Vyzkoušeno s jednoduchými, dvojitými a bez uvozovek, všechny výsledky jsou stejné.
Toto se spouští v bash skriptu, ačkoli příkaz curl se chová stejně, když je zadán přímo na příkazovém řádku. Je to problém se syntaxí OS X?

Přijatá odpověď:

Váš problém je, že {...} výraz je také platná syntaxe shellu. Například spusťte:

echo file/{one,two}

A dostanete:

file/one file/two

Takže když spustíte:

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

{foo,bar,baz} je interpretováno vaším shell a curl skutečně přijímá příkazový řádek:

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

Od curl nevidí {...} výraz, nezískáte
magické zpracování pro #1 . Řešením je jednoduše uzavřít URL
do jednoduchých uvozovek:

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

Jednoduché uvozovky zabraňují jakékoli expanzi řetězce.


Linux
  1. Bash Echo Příkazový řádek spuštěn na samotném příkazovém řádku (ne ve skriptu)?

  2. Skript Bash vypíše příkaz Nenalezen na prázdné řádky

  3. atomic create soubor, pokud neexistuje z bash skriptu

  1. Ubuntu Python shebang line nefunguje

  2. Proměnná prostředí TERM není nastavena

  3. Použijte proměnnou Bash ve skriptu SLURM sbatch

  1. Tomuto skriptu nerozumím. Bash?

  2. Příkaz Rm ve skriptu Bash nefunguje s proměnnou?

  3. Příkaz Conda pracuje v příkazovém řádku, ale ne ve skriptu bash