Jeg er skrive et skript for å lese utdataene fra en kommando til variabel a og b. Dette er 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"
og får syntaksfeilen 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 kommandoen i konsollen, fungerer den for meg uten 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
All hjelp til dette blir virkelig verdsatt.
Kommentarer
Svar
sh
(som i de fleste (fra Debian-avledede) systemer er knyttet til dash
) tillater ikke prosessubstitusjon . Prøv å påkalle av bash script.sh
. Samme anrop av ./script.sh utfører med sha-bang
som er /bin/bash
i skriptet ditt.
Kommentarer
- @MichaelDurrant Ah, din modifikasjon betyr nå det motsatte av det jeg mente å si.
- @muru Jeg kan ' t godta endringer t o
bash
. Jeg menerdash
nøyaktig.file $(which sh)
utgang/bin/sh: symbolic link to 'dash'
- Costas, at ' er det jeg betydde. Michael Durrant endret redigeringen min for å erstatte
dash
medbash
. Takk for at du fikser det. - Du mener prosessubstitusjon (
<( echo foo )
), ikke kommandosubstitusjon ($(echo foo)
) (som er en del av POSIX-spesifikasjonen). - @chepner Du har rett. Takk for kommentaren. Reparert.
Svar
Jeg prøvde å påkalle skriptet som sh file.sh og fikk feilen . Men når jeg påkalte samme skript som ./file.sh og bash file.sh, fungerer det og gir ønsket resultat.
Svar
I tillegg kan du enkelt legge til linjen nedenfor øverst i skriptet:
#!/bin/bash
Den forteller terminalen / konsollen din å utføre skriptet ditt som bash-skript, og at prosessubstitusjonen din <( cmd )
«vil fungere bra.
Kommentarer
- Merk at OP ' skriptet allerede hadde den shebang, men OP var i gang det som
sh file.sh
i stedet forfile.sh
eller./file.sh
(se sitt eget svar )
$ ./script.sh
sh
don ' t tillat kommandosubstitusjon. Prøv å påkalle avbash script.sh
. Samme kall av./script.sh
utføres medsha-bang
som er / bin / ** bash ** i skriptet.