syntaksfejl nær uventet token `< '

Jeg er at skrive et script for at læse output af en kommando til variabel a og b. Dette er scriptet

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

og får syntaksfejlen som:

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

Men når jeg skriver den samme kommando i konsollen, fungerer den uden problemer.

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 

Enhver hjælp til dette er virkelig værdsat.

Kommentarer

  • Jeg er ikke i stand til at gengive denne adfærd fra scriptet. Hvordan påberåber du dig scriptet? Jeg påkalder som: $ ./script.sh
  • @Ketan Jeg påkalder det som sh script.sh. Lige nu prøvede jeg at bruge ./script.sh, og det giver ønsket resultatet. Værdien af a FEJLER Værdien af b STARTES. Mange tak for svaret … Vil bare vide, hvorfor det er anderledes, mens du udfører det samme script ved hjælp af sh file.sh og ./file.sh ??
  • Antag sh don ' t tillader udskiftning af kommando. Prøv at påkalde bash script.sh. Samme kald af ./script.sh udføres med sha-bang som er / bin / ** bash ** i dit script.
  • @SudevJash se: Hvad er forskellen mellem ./ og sh for at køre et script?
  • @Costas Ja, det fungerer fint selv med bash script.sh og jeg får den ønskede output … Mange tak …

Svar

sh (som i de fleste (Debian-afledte) systemer er knyttet til dash) tillader ikke proceserstatning . Prøv at påkalde bash script.sh. Samme kald af ./script.sh udfører med sha-bang som er /bin/bash i dit script.

Kommentarer

  • @MichaelDurrant Ah, din ændring betyder nu det modsatte af, hvad jeg mente at sige.
  • @muru Jeg kan ' t acceptere ændring t o bash. Jeg mener dash nøjagtigt. file $(which sh) output /bin/sh: symbolic link to 'dash'
  • Costas, at ' er hvad jeg mente. Michael Durrant ændrede min redigering for at erstatte dash med bash. Tak for at rette det.
  • Du mener proceserstatning (<( echo foo )), ikke kommandosubstitution ($(echo foo)) (som er en del af POSIX-specifikationen).
  • @chepner Du har ret. Tak for kommentaren. Repareret.

Svar

Jeg forsøgte at påkalde scriptet som sh file.sh og fik fejlen . Men når jeg påkaldte det samme script som ./file.sh og bash file.sh, fungerer det og giver det ønskede resultat.

Svar

Derudover kan du simpelt tilføje linjen nedenunder øverst i dit script:

#!/bin/bash 

Det fortæller din terminal / konsol at udføre dit script som bash-script, og end din procesudskiftning “<( cmd )” fungerer fint.

Kommentarer

  • Bemærk, at OP ' s script allerede havde den shebang, men OP kørte det som sh file.sh i stedet for file.sh eller ./file.sh (se deres eget svar )

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *