błąd składni w pobliżu nieoczekiwanego tokena `< '

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

  • Nie mogę odtworzyć tego zachowania ze skryptu. Jak wywołujesz skrypt? Wywołuję jako: $ ./script.sh
  • @Ketan Wywołuję go jako sh script.sh. Właśnie spróbowałem użyć ./script.sh i daje to pożądany rezultat. Wartość a jest FAILED Wartość b jest STARTED. Dziękuję bardzo za odpowiedź … Chcę tylko wiedzieć, dlaczego jest inaczej podczas wykonywania tego samego skryptu przy użyciu sh file.sh i ./file.sh ??
  • Załóżmy, że sh nie ' nie zezwalaj na zastępowanie poleceń. Spróbuj wywołać przez bash script.sh. To samo wywołanie przez ./script.sh jest wykonywane z sha-bang, czyli / bin / ** bash ** w twoim skrypcie.
  • @SudevJash zobacz: Jaka jest różnica między ./ a sh w uruchomieniu skryptu?
  • @Costas Tak, działa dobrze nawet z bash script.sh i otrzymuję żądane wyniki … Dziękuję bardzo …

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ładnie dash. 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 przez bash. 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 zamiast file.sh lub ./file.sh (patrz własną odpowiedź )

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *