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?
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"]
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.
mach es auf einfachere Weise,
direc=$(basename `pwd`)
Oder benutze die Shell
$ direc=${PWD##*/}
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!
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.
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
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.
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.
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.