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 mitbash script.sh
. Der gleiche Aufruf von./script.sh
wird mitsha-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 meinedash
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
durchbash
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 vonfile.sh
oder./file.sh
(siehe ihre eigene Antwort )