Jsem psaní skriptu pro čtení výstupu příkazu do proměnné aab. Toto je skript
#!/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"
a chyba syntaxe se zobrazuje takto:
line 3: syntax error near unexpected token `<" line 3: `read a b < <(awk /Application Server/ && !seen[$7]++{echo "%s ", $7} /tmp/ServerState)"
Ale když píšu stejný příkaz do konzoly, pracuje to pro mě bez problémů.
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
Jakákoli pomoc s tímto je opravdu oceněna.
Komentáře
odpověď
sh
(který je ve většině systémů (odvozených z Debianu) propojen s dash
) neumožňuje substituci procesu . Zkuste vyvolat bash script.sh
. Stejné volání od ./script.sh se spustí s sha-bang
, což je /bin/bash
ve vašem skriptu.
Komentáře
- @MichaelDurrant Ah, vaše změna nyní znamená opak toho, co jsem chtěl říct.
- @muru Nemohu ' změnu přijmout t o
bash
. Myslím přesnědash
.file $(which sh)
výstup/bin/sh: symbolic link to 'dash'
- Costas, to je ' míněno. Michael Durrant změnil moji úpravu, aby nahradil
dash
bash
. Děkujeme, že jste to napravili. - Máte na mysli substituci procesu (
<( echo foo )
), nikoli substituci příkazu ($(echo foo)
) (což je součástí specifikace POSIX). - @chepner Máte pravdu. Děkuji za komentář. Opraveno.
Odpověď
Pokoušel jsem se vyvolat skript jako sh file.sh a zobrazovala se chyba . Ale když jsem vyvolal stejný skript jako ./file.sh a bash file.sh, funguje to a dává požadovaný výsledek.
Odpověď
Dále můžete jednoduše přidat řádek níže v horní části skriptu:
#!/bin/bash
Říká vašemu terminálu / konzole, aby spustil váš skript jako bash skript, a poté bude vaše substituce procesu „<( cmd )
“ fungovat dobře.
Komentáře
- Všimněte si, že skript OP ' již tento shebang měl, ale OP běžel jako
sh file.sh
místofile.sh
nebo./file.sh
(viz vlastní odpověď )
$ ./script.sh
sh
nepovolujte substituci příkazu '. Zkuste vyvolatbash script.sh
. Stejné volání./script.sh
se spustí ssha-bang
, což je ve vašem skriptu / bin / ** bash **.