Jestem napisanie skryptu odczytującego wynik polecenia do zmiennej a i b. To jest skrypt
#!/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 otrzymujący błąd składni jako:
line 3: syntax error near unexpected token `<" line 3: `read a b < <(awk /Application Server/ && !seen[$7]++{echo "%s ", $7} /tmp/ServerState)"
Ale kiedy piszę to samo polecenie w konsoli, działa ono bez problemu.
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
Każda pomoc w tym zakresie jest bardzo cenna.
Komentarze
Odpowiedź
sh
(który w większości systemów (pochodzących z Debiana) jest połączony z dash
) nie pozwala na zastępowanie procesów . Spróbuj wywołać przez bash script.sh
. To samo wywołanie przez ./script.sh jest wykonywane z sha-bang
, czyli /bin/bash
w swoim skrypcie.
Komentarze
- @MichaelDurrant Ach, twoja modyfikacja oznacza teraz przeciwieństwo tego, co miałem do powiedzenia.
- @muru Nie mogę ' nie akceptować modyfikacji t o
bash
. Mam na myśli dokładniedash
.file $(which sh)
wyjście/bin/sh: symbolic link to 'dash'
- Costas, to ' jest tym, co ja Oznaczało. Michael Durrant zmienił moją edycję, aby zastąpić
dash
przezbash
. Dziękujemy za naprawienie tego. - Masz na myśli podstawianie procesu (
<( echo foo )
), a nie zastępowanie poleceń ($(echo foo)
) (które jest częścią specyfikacji POSIX). - @chepner Masz rację. Dziękuję za komentarz. Naprawiony.
Odpowiedź
Próbowałem wywołać skrypt jako sh file.sh i otrzymywałem błąd . Ale kiedy wywołałem ten sam skrypt, co ./file.sh i bash file.sh, działa i daje pożądany efekt.
Odpowiedź
Dodatkowo możesz po prostu dodać poniższą linię na górze skryptu:
#!/bin/bash
Mówi terminalowi / konsoli, aby wykonał skrypt jako skrypt bash, a wtedy podstawianie procesu „<( cmd )
” będzie działać dobrze.
Komentarze
- Zwróć uwagę, że w skrypcie OP ' było już to shebang, ale OP działał to jako
sh file.sh
zamiastfile.sh
lub./file.sh
(patrz własną odpowiedź )
$ ./script.sh
sh
nie ' nie zezwalaj na zastępowanie poleceń. Spróbuj wywołać przezbash script.sh
. To samo wywołanie przez./script.sh
jest wykonywane zsha-bang
, czyli / bin / ** bash ** w twoim skrypcie.