Ich bin mit dieser Syntax vertraut:
cmd1 << EOF | cmd2
text
EOF
aber gerade entdeckt, dass Bash mir erlaubt zu schreiben:
cmd1 << EOF |
text
EOF
cmd2
(Der Heredoc wird als Eingabe für cmd1 verwendet, und die Ausgabe von cmd1 wird an cmd2 weitergeleitet.) Dies scheint eine sehr merkwürdige Syntax zu sein. Ist es tragbar?
big-long-command1 with lots of args << EOF | big-long-command2 with lots of args
. Die "ungerade Syntax" scheint der beste Weg zu sein.Antworten:
Ja, der POSIX-Standard erlaubt dies. Nach der Version 2008:
Und enthält dieses Beispiel für mehrere "Hier-Dokumente" in derselben Zeile:
Es ist also kein Problem, Umleitungen oder Pipes durchzuführen. Ihr Beispiel ähnelt ungefähr so:
Die Shell-Grammatik (weiter unten auf der verlinkten Seite) enthält die folgenden Definitionen:
Auf ein Pipe-Symbol kann also ein Zeilenende folgen und dennoch als Teil einer Pipeline betrachtet werden.
quelle
Ja, es ist in der POSIX-Shell-Grammatik. Sie können auch mehr als ein here-doc für denselben Befehl haben (einige andere Beispiele verwenden zwei
cat
Aufrufe, aber dies funktioniert auch):Dies ist erfunden (unter Verwendung von 2 here-docs für stdin), aber wenn Sie daran denken, Eingaben für verschiedene Dateideskriptoren bereitzustellen, ist dies sofort sinnvoll.
Es besteht auch die Möglichkeit, das
cat
komplett fallen zu lassen . Warum nicht das Here-Dokument direkt zur Verfügung stellen fürcmd
:quelle
sudo tee /etc/securefile.conf <<EOF
.Hmm, ich nehme an, ja, laut dem Test in Bash im POSIX-Modus:
quelle
EOF
. Die Eingabeaufforderung wird sich seltsam verhalten und Sie werden sich fragen, was zum Teufel los istHallo, überprüfe das zum Beispiel
Grüße
quelle