eroare de sintaxă lângă simbolul neașteptat `< '

Sunt scrierea unui script pentru a citi ieșirea unei comenzi la variabilele a și b. Acesta este scriptul

#!/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" 

și obține eroarea de sintaxă ca:

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

Dar când scriu aceeași comandă în consolă, funcționează pentru mine fără nicio problemă.

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 

Orice ajutor în acest sens este foarte apreciat.

Comentarii

  • Nu pot reproduce acest comportament din script. Cum invoci scenariul? Invoc ca: $ ./script.sh
  • @Ketan îl invoc ca sh script.sh. Chiar acum am încercat să folosesc ./script.sh și dă rezultatul dorinței. Valoarea lui a eșuat Valoarea lui b este PORNIT. Vă mulțumesc foarte mult pentru răspuns … Vreau doar să știu de ce este diferit în timp ce executați același script folosind sh file.sh și ./file.sh ??
  • Să presupunem că sh nu ' nu permite substituirea comenzii. Încercați să invocați prin bash script.sh. Același apel de la ./script.sh se execută cu sha-bang care este / bin / ** bash ** în scriptul dvs.
  • @SudevJash vezi: Care este diferența dintre ./ și sh pentru a rula un script?
  • @Costas Da, funcționează bine chiar și cu bash script.sh și obțin rezultatul dorit … Vă mulțumesc foarte mult …

Răspundeți

sh (care în majoritatea sistemelor (derivate din Debian) este legat de dash) nu permite substituirea procesului . Încercați să invocați prin bash script.sh. Același apel prin ./script.sh se execută cu sha-bang care este /bin/bash în scriptul dvs.

Comentarii

  • @MichaelDurrant Ah, modificarea ta înseamnă acum opusul a ceea ce am vrut să spun.
  • @muru Nu pot ' să accept modificarea t o bash. Adică dash exact. file $(which sh) ieșire /bin/sh: symbolic link to 'dash'
  • Costas, ceea ce ' este ceea ce am însemnat. Michael Durrant mi-a modificat editarea pentru a înlocui dash cu bash. Vă mulțumim că ați remediat-o.
  • Înțelegeți substituirea procesului (<( echo foo )), nu substituirea comenzii ($(echo foo)) (care face parte din specificația POSIX).
  • @chepner Ai dreptate. Vă mulțumesc pentru comentariu. S-a reparat.

Răspuns

Încercam să invoc scriptul ca fișier sh.sh și primeam eroarea . Dar când am invocat același script ca ./file.sh și bash file.sh funcționează și dă rezultatul dorit.

Răspuns

În plus, puteți adăuga linia de mai jos în partea de sus a scriptului:

#!/bin/bash 

Îi spune terminalului / consolei să vă execute scriptul ca script bash, iar înlocuirea procesului dvs. „<( cmd )” va funcționa bine.

Comentarii

  • Rețineți că scriptul OP ' avea deja acel shebang, dar OP rulează ca sh file.sh în loc de file.sh sau ./file.sh (vezi propriul răspuns )

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *