syntaxisfout bij onverwacht token `< '

Ik ben schrijven van een script om de uitvoer van een commando naar variabele a en b te lezen. Dit is het script

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

en krijgt de syntaxisfout als:

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

Maar wanneer ik hetzelfde commando in de console typ, werkt het zonder problemen voor mij.

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 

Alle hulp hierbij wordt echt op prijs gesteld.

Reacties

  • Ik kan dit gedrag niet reproduceren vanuit een script. Hoe roep je het script op? Ik roep het aan als: $ ./script.sh
  • @Ketan Ik roep het aan als sh script.sh. Ik heb net geprobeerd ./script.sh te gebruiken en het geeft het gewenste resultaat. De waarde van a is MISLUKT. De waarde van b is GESTART. Heel erg bedankt voor het antwoord … Ik wil gewoon weten waarom het anders is tijdens het uitvoeren van hetzelfde script met sh file.sh en ./file.sh ??
  • Stel dat sh laat ' geen opdrachtvervanging toe. Probeer aan te roepen door bash script.sh. Dezelfde aanroep door ./script.sh wordt uitgevoerd met sha-bang wat / bin / ** bash ** is in je script.
  • @SudevJash zie: Wat is het verschil tussen ./ en sh om een script uit te voeren?
  • @Costas Ja, het werkt prima, zelfs met bash script.sh en ik krijg de gewenste output … Heel erg bedankt …

Antwoord

sh (die in de meeste (van Debian afgeleide) systemen is gekoppeld aan dash) processubstitutie niet toestaat . Probeer aan te roepen door bash script.sh. Dezelfde aanroep door ./script.sh wordt uitgevoerd met sha-bang wat /bin/bash in uw script.

Opmerkingen

  • @MichaelDurrant Ah, je wijziging betekent nu het tegenovergestelde van wat ik bedoelde te zeggen.
  • @muru Ik kan ' geen wijziging accepteren t o bash. Ik bedoel precies dash. file $(which sh) output /bin/sh: symbolic link to 'dash'
  • Costas, dat ' is wat ik bedoelde. Michael Durrant heeft mijn bewerking gewijzigd om dash te vervangen door bash. Bedankt voor het oplossen.
  • U bedoelt procesvervanging (<( echo foo )), niet opdrachtvervanging ($(echo foo)) (die maakt deel uit van de POSIX-specificatie).
  • @chepner Je hebt gelijk. Bedankt voor je reactie. Gerepareerd.

Answer

Ik probeerde het script aan te roepen als sh file.sh en kreeg de foutmelding . Maar toen ik hetzelfde script aanriep als ./file.sh en bash file.sh, werkt het en geeft het het gewenste resultaat.

Answer

Bovendien kunt u eenvoudig de regel hieronder aan uw script toevoegen:

#!/bin/bash 

Het vertelt uw terminal / console om uw script uit te voeren als bash-script, en dan zal uw procesvervanging “<( cmd )” goed werken.

Reacties

  • Merk op dat het script van het OP ' s script al die shebang had, maar het OP liep het als sh file.sh in plaats van file.sh of ./file.sh (zie hun eigen antwoord )

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *