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
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 preciesdash
.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 doorbash
. 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 vanfile.sh
of./file.sh
(zie hun eigen antwoord )
$ ./script.sh
sh
laat ' geen opdrachtvervanging toe. Probeer aan te roepen doorbash script.sh
. Dezelfde aanroep door./script.sh
wordt uitgevoerd metsha-bang
wat / bin / ** bash ** is in je script.