Angenommen, ich habe ein Skript, das ich an einen anderen Befehl weiterleiten oder in eine Datei umleiten möchte ( sh
für die Beispiele an). Angenommen, ich verwende bash.
Ich könnte es tun mit echo
:
echo "touch somefile
echo foo > somefile" | sh
Ich könnte auch fast dasselbe tun mit cat
:
cat << EOF
touch somefile
echo foo > somefile
EOF
Aber wenn ich "EOF" durch "EOF | sh" ersetze, denkt es nur, dass es ein Teil des Heredocs ist.
Wie kann ich dafür sorgen, dass der cat
Text von stdin ausgegeben und dann an eine beliebige Stelle weitergeleitet wird?
shell
io-redirection
cat
here-document
strugee
quelle
quelle
touch
ist es denn da, was genau willst du? wird nur die eingabedatei gelesen und mit stdout zu einer anderen umgeleitet?echo
- ich habe mich gefragt, was das Äquivalent dazu wärecat
.sh
Skript aus mehreren Zeichenfolgen erstellt und direkt an übergebensh
. Ich habe festgestellt, dass Ihr Q die Textausgabe mehrerer Befehle, einschließlich eines HERE-Dokuments, direkt an einen Befehl übergeben möchte. Welches ist, was Ashs Antwort 2. Beispiel tut.Antworten:
Hierfür gibt es mehrere Möglichkeiten. Das einfachste ist wahrscheinlich das:
Eine andere, meiner Meinung nach schönere Syntax:
Das funktioniert auch, aber ohne die Subshell:
Weitere Variationen:
Oder:
Übrigens erwarte ich, dass die Verwendung von
cat
in Ihrer Frage ein Platzhalter für etwas anderes ist. Wenn nicht, nehmen Sie es wie folgt aus:Was könnte dazu vereinfacht werden:
oder:
Ausgabe umleiten statt leiten
Verwenden Sie
cat
, um das Äquivalent zu erhaltenecho test > out
:Mehrere Dokumente hier
Dies erzeugt die Ausgabe:
Folgendes ist los:
( ... )
und führt die darin enthaltenen Befehle in einer Subshell aus.cat <&3
Befehl zum Ausführen von cat mit dem Dateideskriptor (fd) 0 (stdin), umgeleitet von fd 3; Mit anderen Worten, die Eingabe von fd 3 wird ausgeglichen.(...)
gestartet wird, sieht die Shell, dass die beiden hier aufgeführten Dokumente umgeleitet werden, und ersetzt fd 0 (<<EOF
) und fd 3 (3<<EOF2
) durch die Leseseite von Pipesquelle
(cat; echo ---; exec <&3; cat) <<EOF 3<<EOF2 >out
und dann diesen Befehl mit zwei Hier-Blöcken in einer Reihe einzugeben.cat
Äquivalent vonecho test > out
wäre, mit einem Heredoc. Während Ihr gegebenes Beispiel eine Umleitung am Ende der Pipe hinzufügte.Ich möchte nur darauf hinweisen, dass die Verwendung
meow
genauso gültig ist wieEOF
.Dieses Skript wird
Meow!
an eine Datei mit dem Namen angehängtcat
:Speichern unter
cats
und ausführbar machen mitchmod +x cats
, dann ausführen mit./cats
:Erläuterung:
cat <<meow
ist die hier verwendete Dokumentsyntax . Es weist das Skript an, den Textblock aufzunehmen, der dieser Zeile folgt, bis es auf die Zeichenfolge stößtmeow
. Der Inhalt wird dann ausgegeben (oder weitergeleitet).>> cat
leitet zu der genannten Datei weitercat
.>
anstelle von verwenden>>
, wird die Datei überschrieben, anstatt sie anzufügen.Meow!
ist der Inhalt dieses Dokuments .meow
ist die Endemarkierung für das Here-Dokument . Die Inhalte werden unter Verwendung von>>
angehängtcat
.Piping sowohl zu stdout als auch zu einer Datei:
Für die von Ihnen angeforderte Verrohrung ist kein Dokument hier erforderlich.
cat
kann nicht gleichzeitig Text ausgeben und weitergeben, passt abertee
perfekt zu dem, wonach Sie fragen:Dadurch wird sowohl die Zeichenfolge ausgegeben
echo
als auchecho
in eine Datei mit dem Namen geschriebentee
.Sie können die Ausgabe auch weiterleiten
cat
, wenn dies Teil der Anforderung ist, entweder mit:Oder nur:
Inhalt der Datei:
quelle
>
auch keine Pipes, wie Ihre letzte Kugel andeutet.>
kann Pipes erstellen,zsh
wenn derselbe fd mehrmals umgeleitet wird wie inecho foo >&1 > tee
oderecho foo > tee | cat
, wobeizsh
ein internes implementiert wirdtee
, um die Ausgabeecho
sowohl ancat
dietee
Datei als auch an die Datei weiterzuleiten .