wake-up-neo.com

Bash: Syntaxfehler: unerwartete Umleitung

Ich mache das in einem Skript:

read direc <<< $(basename `pwd`)

und ich bekomme:

Syntax error: redirection unexpected

in einer Ubuntu-Maschine

/bin/bash --version
GNU bash, version 4.0.33(1)-release (x86_64-pc-linux-gnu)

ich erhalte diese Fehlermeldung jedoch nicht in einer anderen Suse-Maschine:

/bin/bash --version
GNU bash, version 3.2.39(1)-release (x86_64-suse-linux-gnu)
Copyright (C) 2007 Free Software Foundation, Inc.

Warum der Fehler?

105
flow

Verweist Ihr Skript in seiner Hash-Bang-Zeile auf /bin/bash oder /bin/sh? Die Standard-Shell des Systems in Ubuntu ist dash , nicht bash . Wenn Sie #!/bin/sh haben, verwendet Ihr Skript eine andere Shell als erwartet. Dash hat keinen <<<-Umleitungsoperator.

182
John Kugelman

Docker:

Ich habe dieses Problem von meiner Dockerfile bekommen, wie ich es hatte:

RUN bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)

Nach diesem Problem wurde es jedoch gelöst:

Mit dem Formular exec können Sie vermeiden, dass Shell-Zeichenfolgen mischen, und an RUN-Befehle, die ein Basisabbild verwenden, das /bin/sh nicht enthält.

Hinweis

Um eine andere Shell als /bin/sh zu verwenden, verwenden Sie das Formular exec die gewünschte Shell übergeben. Zum Beispiel,

RUN ["/bin/bash", "-c", "echo hello"]

Lösung:

RUN ["/bin/bash", "-c", "bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)"]

Beachten Sie die Anführungszeichen um den Parameter each.

11
kemicofa

mach es auf einfachere Weise,

direc=$(basename `pwd`)

Oder benutze die Shell

$ direc=${PWD##*/}
2
ghostdog74

Sie können die Ausgabe dieses Befehls abrufen und in eine Variable einfügen. dann verwenden Sie heredoc. zum Beispiel:

nc -l -p 80 <<< "tested like a charm";

kann geschrieben werden wie:

nc -l -p 80 <<EOF
tested like a charm
EOF

und so (das ist was du willst):

text="tested like a charm"
nc -l -p 80 <<EOF
$text
EOF

Praktisches Beispiel in busybox unter docker container:

[email protected]:~$ docker run --rm -it busybox
/ # nc -l -p 80 <<< "tested like a charm";
sh: syntax error: unexpected redirection


/ # nc -l -p 80 <<EOL
> tested like a charm
> EOL
^Cpunt!       => socket listening, no errors. ^Cpunt! is result of CTRL+C signal.


/ # text="tested like a charm"
/ # nc -l -p 80 <<EOF
> $text
> EOF
^Cpunt!
1
TechJS

Ein weiterer Grund für den Fehler kann sein, wenn Sie einen Cron-Job ausführen, der eine Subversion-Arbeitskopie aktualisiert und anschließend versucht hat, ein versioniertes Skript auszuführen, das sich nach der Aktualisierung in einem Konfliktzustand befand. 

1
Motin

In meinem Fall ist der Fehler, weil ich ">>" zweimal gesetzt habe 

mongodump --db=$DB_NAME --collection=$col --out=$BACKUP_LOCATION/$DB_NAME-$BACKUP_DATE >> >> $LOG_PATH

ich korrigiere es einfach als 

mongodump --db=$DB_NAME --collection=$col --out=$BACKUP_LOCATION/$DB_NAME-$BACKUP_DATE >> $LOG_PATH
0
Mansur Ali

Bevor Sie das Skript ausführen, sollten Sie die erste Zeile des Shell-Skripts für den Interpreter überprüfen.

Beispiel: Wenn Skripte mit/bin/bash beginnen, führen Sie das Skript mit dem folgenden Befehl aus.

wenn das Skript mit/bin/sh beginnt, führen Sie das Skript mit dem folgenden Befehl aus. "sh script_name.sh"

./sample.sh - Dies wird den Interpreter aus der ersten Zeile des Skripts erkennen und ausführen.

Verschiedene Linux-Distributionen mit unterschiedlichen Shells als Standard.

0
SjK

Wenn ich auf meinem Computer ein Skript direkt ausführe, ist der Standardwert bash.

Wenn ich es mit Sudo starte, ist der Standardwert sh.

Deshalb habe ich dieses Problem bei der Verwendung von Sudo festgestellt.

0
Michael Mather

Wenn Sie Folgendes zum Ausführen Ihres Skripts verwenden:

Sudo sh ./script.sh

Dann möchten Sie stattdessen Folgendes verwenden:

Sudo bash ./script.sh

Der Grund dafür ist, dass Bash nicht die Standard-Shell für Ubuntu ist. Wenn Sie "sh" verwenden, wird die Standard-Shell verwendet. Das ist eigentlich Dash. Dies geschieht unabhängig davon, ob Sie #!/bin/bash oben in Ihrem Skript haben. Daher müssen Sie explizit angeben, dass bash wie oben gezeigt verwendet werden soll, und Ihr Skript sollte erwartungsgemäß ausgeführt werden.

Dash unterstützt Umleitungen nicht wie Bash.

0