Nehmen wir an, ich habe ein Skript, das ich an einen anderen Befehl weiterleiten oder an eine Datei umleiten möchte (Weiterleitung an sh
für die Beispiele). Angenommen, ich verwende bash.
Ich könnte es mit echo
machen :
echo "touch somefile
echo foo > somefile" | sh
Ich könnte auch fast dasselbe mit cat
machen :
cat << EOF
touch somefile
echo foo > somefile
EOF
Aber wenn ich „EOF“ durch „EOF | sh“ es denkt nur, dass es ein Teil des Heredoc ist.
Wie kann ich es so machen, dass cat
gibt Text von stdin aus und leitet ihn dann an eine beliebige Stelle weiter?
Akzeptierte Antwort:
Es gibt mehrere Möglichkeiten, dies zu tun. Das einfachste ist wahrscheinlich das:
cat <<EOF | sh
touch somefile
echo foo > somefile
EOF
Eine andere, meiner Meinung nach schönere Syntax:
(
cat <<EOF
touch somefile
echo foo > somefile
EOF
) | sh
Das funktioniert auch, aber ohne die Subshell:
{
cat <<EOF
touch somefile
echo foo > somefile
EOF
} | sh
Weitere Variationen:
cat <<EOF |
touch somefile
echo foo > somefile
EOF
sh
Oder:
{ cat | sh; } << EOF
touch somefile
echo foo > somefile
EOF
Übrigens erwarte ich die Verwendung von cat
in Ihrer Frage ist ein Platzhalter für etwas anderes. Wenn nicht, nehmen Sie es wie folgt heraus:
sh <<EOF
touch somefile
echo foo > somefile
EOF
Was so vereinfacht werden könnte:
sh -c 'touch somefile; echo foo > somefile'
oder:
sh -c 'touch somefile
echo foo > somefile'
Ausgabe umleiten statt verrohren
sh >out <<EOF
touch somefile
echo foo > somefile
EOF
Verwenden von cat
um das Äquivalent von echo test > out
zu erhalten :
cat >out <<EOF
test
EOF
Mehrere Here-Dokumente
( cat; echo ---; cat <&3 ) <<EOF 3<<EOF2
hi
EOF
there
EOF2
Dies erzeugt die Ausgabe:
hi
---
there
Folgendes ist los:
- Die Shell sieht den
( ... )
und führt die eingeschlossenen Befehle in einer Subshell aus. - Die Katze und das Echo sind einfach genug. Die
cat <&3
sagt, dass cat mit dem Dateideskriptor (fd) 0 (stdin) ausgeführt werden soll, der von fd 3 umgeleitet wird; mit anderen Worten, cat out die Eingabe von fd 3. - Vor dem
(...)
gestartet wird, sieht die Shell die beiden hier angegebenen Document Redirects und ersetzt fd 0 (<<EOF
) und fd 3 (3<<EOF2
) mit der Leseseite von Pipes - Sobald der Anfangsbefehl gestartet wurde, liest die Shell ihre Standardeingabe, bis EOF erreicht ist, und sendet diese an die Schreibseite der ersten Pipe
- Als nächstes macht es dasselbe mit EOF2 und der Schreibseite der zweiten Pipe