Jag är skriva ett skript för att läsa utdata från ett kommando till variabel a och b. Detta är skriptet
#!/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"
och får syntaxfelet 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 jag skriver samma kommando i konsolen fungerar det för mig utan 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
All hjälp med detta uppskattas verkligen.
Kommentarer
Svar
sh
(som i de flesta (från Debian härledda) system är länkade till dash
) tillåter inte processersättning . Försök anropa av bash script.sh
. Samma anrop av ./script.sh körs med sha-bang
vilket är /bin/bash
i ditt skript.
Kommentarer
- @MichaelDurrant Ah, din modifiering betyder nu motsatsen till vad jag tänkte säga.
- @muru Jag kan ' t acceptera modifiering t o
bash
. Jag menardash
exakt.file $(which sh)
output/bin/sh: symbolic link to 'dash'
- Costas, att ' är vad jag menade. Michael Durrant ändrade min redigering för att ersätta
dash
medbash
. Tack för att du fixade det. - Du menar processersättning (
<( echo foo )
), inte kommandosubstitution ($(echo foo)
) (vilket är en del av POSIX-specifikationen). - @chepner Du har rätt. Tack för din kommentar. Reparerad.
Svar
Jag försökte åberopa skriptet som sh file.sh och fick felet . Men när jag åberopade samma skript som ./file.sh och bash file.sh fungerar det och ger önskat resultat.
Svar
Dessutom kan du enkelt lägga till raden nedan längst upp i skriptet:
#!/bin/bash
Den berättar för din terminal / konsol att köra ditt skript som bash-skript, och än att din processersättning ”<( cmd )
” fungerar bra.
Kommentarer
- Observera att OP ' s skript redan hade den shebang, men OP kördes det som
sh file.sh
istället förfile.sh
eller./file.sh
(se sitt eget svar )
$ ./script.sh
sh
don ' t tillåt kommandosubstitution. Försök åberopa medbash script.sh
. Samma anrop av./script.sh
körs medsha-bang
vilket är / bin / ** bash ** i ditt skript.