Syntaxfehler in der Nähe eines unerwarteten Tokens `< '

Ich bin Schreiben eines Skripts zum Lesen der Ausgabe eines Befehls in die Variablen a und b. Dies ist das 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" 

und der folgende Syntaxfehler lautet:

line 3: syntax error near unexpected token `<" line 3: `read a b < <(awk /Application Server/ && !seen[$7]++{echo "%s ", $7} /tmp/ServerState)" 

Aber Wenn ich denselben Befehl in die Konsole eingebe, funktioniert er problemlos für mich.

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 

Jede Hilfe hierzu ist sehr willkommen.

Kommentare

  • Ich kann dieses Verhalten nicht aus dem Skript reproduzieren. Wie rufst du das Skript auf? Ich rufe auf als: $ ./script.sh
  • @Ketan Ich rufe es als sh script.sh auf. Gerade habe ich versucht, ./script.sh zu verwenden, und es gibt das gewünschte Ergebnis. Der Wert von a ist FEHLGESCHLAGEN Der Wert von b ist STARTED. Vielen Dank für die Antwort … Ich möchte nur wissen, warum es anders ist, wenn dasselbe Skript mit sh file.sh und ./file.sh ausgeführt wird.
  • Angenommen, sh ' erlaubt keine Befehlsersetzung. Versuchen Sie es mit bash script.sh. Der gleiche Aufruf von ./script.sh wird mit sha-bang ausgeführt, das in Ihrem Skript / bin / ** bash ** ist.
  • @SudevJash siehe: Was ist der Unterschied zwischen ./ und sh, um ein Skript auszuführen?
  • @Costas Ja, es funktioniert auch mit bash script.sh und ich erhalte die gewünschte Ausgabe … Vielen Dank …

Antwort

sh (das in den meisten (von Debian abgeleiteten) Systemen mit dash verknüpft ist) erlaubt keine Prozessersetzung . Versuchen Sie, bash script.sh aufzurufen. Der gleiche Aufruf von ./script.sh wird mit sha-bang ausgeführt, das /bin/bash in Ihrem Skript.

Kommentare

  • @MichaelDurrant Ah, Ihre Änderung bedeutet jetzt das Gegenteil von dem, was ich sagen wollte.
  • @muru Ich kann ' keine Änderung akzeptieren t o bash. Ich meine dash genau. file $(which sh) Ausgabe /bin/sh: symbolic link to 'dash'
  • Costas, das ' ist was ich gemeint. Michael Durrant hat meine Bearbeitung geändert, um dash durch bash zu ersetzen. Vielen Dank, dass Sie das Problem behoben haben.
  • Sie meinen Prozessersetzung (<( echo foo )), nicht Befehlsersetzung ($(echo foo)) (welche ist Teil der POSIX-Spezifikation.
  • @chepner Sie haben Recht. Danke für deinen Kommentar. Repariert.

Antwort

Ich habe versucht, das Skript als sh file.sh aufzurufen, und habe den Fehler erhalten . Aber wenn ich das gleiche Skript wie ./file.sh und bash file.sh aufgerufen habe, funktioniert es und liefert das gewünschte Ergebnis.

Antwort

Zusätzlich können Sie einfach die folgende Zeile oben in Ihr Skript einfügen:

#!/bin/bash 

Es weist Ihr Terminal / Ihre Konsole an, Ihr Skript als Bash-Skript auszuführen, und dann funktioniert Ihre Prozessersetzung „<( cmd )“ einwandfrei.

Kommentare

  • Beachten Sie, dass das Skript des OP ' diesen Shebang bereits hatte, aber das OP ausgeführt wurde es als sh file.sh anstelle von file.sh oder ./file.sh (siehe ihre eigene Antwort )

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.