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 menerdashnø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
dashmedbash. 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.shi stedet forfile.sheller./file.sh(se deres eget svar )
$ ./script.shshdon ' t tillader udskiftning af kommando. Prøv at påkaldebash script.sh. Samme kald af./script.shudføres medsha-bangsom er / bin / ** bash ** i dit script.