chyba syntaxe poblíž neočekávaného tokenu `< '

Jsem psaní skriptu pro čtení výstupu příkazu do proměnné aab. Toto je skript

#!/bin/bash read a b < <(awk "/Application Server/ && !seen[$7]++{printf "%s ", $7}" /tmp/ServerState) echo "The value of a is $a" echo "The value of b is $b" 

a chyba syntaxe se zobrazuje takto:

line 3: syntax error near unexpected token `<" line 3: `read a b < <(awk /Application Server/ && !seen[$7]++{echo "%s ", $7} /tmp/ServerState)" 

Ale když píšu stejný příkaz do konzoly, pracuje to pro mě bez problémů.

app@user:/tmp> read a b < <(awk "/Application Server/ && !seen[$7]++{printf "%s ", $7}" /tmp/ServerState) app@user:/tmp> echo $a FAILED app@user:/tmp> echo $b STARTED 

Jakákoli pomoc s tímto je opravdu oceněna.

Komentáře

  • Toto chování nemohu reprodukovat ze skriptu. Jak vyvoláváte scénář? Vyvolávám jako: $ ./script.sh
  • @Ketan Vyvolávám to jako sh script.sh. Právě jsem se pokusil použít ./script.sh a dává výsledek touhy. Hodnota a je FAILED Hodnota b je STARTED. Mockrát děkuji za odpověď … Jen chci vědět, proč je to jiné při provádění stejného skriptu pomocí sh file.sh a ./file.sh ??
  • Předpokládejme sh nepovolujte substituci příkazu '. Zkuste vyvolat bash script.sh. Stejné volání ./script.sh se spustí s sha-bang, což je ve vašem skriptu / bin / ** bash **.
  • @SudevJash viz: Jaký je rozdíl mezi spuštěním skriptu mezi ./ a sh?
  • @Costas Ano, funguje to dobře i s bash script.sh a dostávám požadovaný výstup … moc děkuji …

odpověď

sh (který je ve většině systémů (odvozených z Debianu) propojen s dash) neumožňuje substituci procesu . Zkuste vyvolat bash script.sh. Stejné volání od ./script.sh se spustí s sha-bang, což je /bin/bash ve vašem skriptu.

Komentáře

  • @MichaelDurrant Ah, vaše změna nyní znamená opak toho, co jsem chtěl říct.
  • @muru Nemohu ' změnu přijmout t o bash. Myslím přesně dash. file $(which sh) výstup /bin/sh: symbolic link to 'dash'
  • Costas, to je ' míněno. Michael Durrant změnil moji úpravu, aby nahradil dash bash. Děkujeme, že jste to napravili.
  • Máte na mysli substituci procesu (<( echo foo )), nikoli substituci příkazu ($(echo foo)) (což je součástí specifikace POSIX).
  • @chepner Máte pravdu. Děkuji za komentář. Opraveno.

Odpověď

Pokoušel jsem se vyvolat skript jako sh file.sh a zobrazovala se chyba . Ale když jsem vyvolal stejný skript jako ./file.sh a bash file.sh, funguje to a dává požadovaný výsledek.

Odpověď

Dále můžete jednoduše přidat řádek níže v horní části skriptu:

#!/bin/bash 

Říká vašemu terminálu / konzole, aby spustil váš skript jako bash skript, a poté bude vaše substituce procesu „<( cmd )“ fungovat dobře.

Komentáře

  • Všimněte si, že skript OP ' již tento shebang měl, ale OP běžel jako sh file.sh místo file.sh nebo ./file.sh (viz vlastní odpověď )

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *