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
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 menerdash
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
medbash
. 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 forfile.sh
eller./file.sh
(se deres eget svar )
$ ./script.sh
sh
don ' t tillader udskiftning af kommando. Prøv at påkaldebash script.sh
. Samme kald af./script.sh
udføres medsha-bang
som er / bin / ** bash ** i dit script.