Sunt scrierea unui script pentru a citi ieșirea unei comenzi la variabilele a și b. Acesta este scriptul
#!/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"
și obține eroarea de sintaxă ca:
line 3: syntax error near unexpected token `<" line 3: `read a b < <(awk /Application Server/ && !seen[$7]++{echo "%s ", $7} /tmp/ServerState)"
Dar când scriu aceeași comandă în consolă, funcționează pentru mine fără nicio 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
Orice ajutor în acest sens este foarte apreciat.
Comentarii
Răspundeți
sh
(care în majoritatea sistemelor (derivate din Debian) este legat de dash
) nu permite substituirea procesului . Încercați să invocați prin bash script.sh
. Același apel prin ./script.sh se execută cu sha-bang
care este /bin/bash
în scriptul dvs.
Comentarii
- @MichaelDurrant Ah, modificarea ta înseamnă acum opusul a ceea ce am vrut să spun.
- @muru Nu pot ' să accept modificarea t o
bash
. Adicădash
exact.file $(which sh)
ieșire/bin/sh: symbolic link to 'dash'
- Costas, ceea ce ' este ceea ce am însemnat. Michael Durrant mi-a modificat editarea pentru a înlocui
dash
cubash
. Vă mulțumim că ați remediat-o. - Înțelegeți substituirea procesului (
<( echo foo )
), nu substituirea comenzii ($(echo foo)
) (care face parte din specificația POSIX). - @chepner Ai dreptate. Vă mulțumesc pentru comentariu. S-a reparat.
Răspuns
Încercam să invoc scriptul ca fișier sh.sh și primeam eroarea . Dar când am invocat același script ca ./file.sh și bash file.sh funcționează și dă rezultatul dorit.
Răspuns
În plus, puteți adăuga linia de mai jos în partea de sus a scriptului:
#!/bin/bash
Îi spune terminalului / consolei să vă execute scriptul ca script bash, iar înlocuirea procesului dvs. „<( cmd )
” va funcționa bine.
Comentarii
- Rețineți că scriptul OP ' avea deja acel shebang, dar OP rulează ca
sh file.sh
în loc defile.sh
sau./file.sh
(vezi propriul răspuns )
$ ./script.sh
sh
nu ' nu permite substituirea comenzii. Încercați să invocați prinbash script.sh
. Același apel de la./script.sh
se execută cusha-bang
care este / bin / ** bash ** în scriptul dvs.