Soweit ich weiß, kann ich mit dem Befehl tee die Standardausgabe auf den Bildschirm und weitere Dateien aufteilen:
command -option1 -option2 argument | tee file1 file2 file3
Ist es möglich, die Ausgabe mit tee auf Befehle anstatt auf Dateien umzuleiten, sodass ich theoretisch eine Befehlskette erstellen kann?
command-line
pipe
tee
Abdul Al Hazred
quelle
quelle
Antworten:
Sie können Named Pipes ( http://linux.die.net/man/1/mkfifo ) in der Befehlszeile von verwenden
tee
und die Befehle in den Named Pipes lesen lassen.Wenn der
command
Vorgang abgeschlossen ist,tee
werden die benannten Pipes geschlossen, wodurch ein EOF (Lesen von 0 Bytes) für jedes der Pipes signalisiert wird, das/tmp/dataN
normalerweise diecmdN
Prozesse beenden würde . Reales Beispiel:Aufgrund der Hintergrundprozesse gab die Shell vor der Programmausgabe eine Eingabeaufforderung zurück. Alle drei Instanzen von wurden
wc
normal beendet.quelle
/tmp/data/{0,1,2}
. Andererseits könnte man in bash die Prozessersetzung verwenden undmkfifo
ganz überspringenWenn ich richtig verstehe, sind Sie für das Äquivalent
tee file1 file2 file3
, sondern als Schreib die gleichen Daten zu drei Dateienfile1
,file2
undfile3
, Sie Rohr wollen die gleichen Daten in drei Befehlecmd1
,cmd2
undcmd3
, das heißtsollte gleichbedeutend sein mit
außer das
…
würde nur einmal ausgeführt werden.Dafür gibt es zwei Möglichkeiten.
Ksh93, bash und zsh unterstützen die Prozessersetzung . Dies ist eine Verallgemeinerung von Pipes, die es dem Argument eines Befehls ermöglicht, eine Datei zu sein, in die beim Schreiben Daten als Eingabe an einen Befehl übergeben werden. . Das ist,
druckt
hello
auf Standardausgabe und läuft zusätzlichcmd1
mithello
als Eingabe.So zum Beispiel, wenn Sie die Eingabe von duplizieren wollen
somecommand
und gibt es an beidecmd1
undcmd2
können Sie verwendenWenn Ihre Shell keine Prozessersetzung unterstützt, können Sie stattdessen Named Pipes verwenden. Siehe Arcege Antwort , wie das funktioniert. Named Pipes sind weniger praktisch als die Prozessersetzung, da Sie sie erstellen und löschen sowie Prozesse manuell starten und synchronisieren müssen. Sie haben den Vorteil, dass sie vollständig portierbar sind, während nicht alle Shells Prozessersetzungen unterstützen. Sie können auch in anderen Szenarien als denen verwendet werden, für die die Prozessersetzung vorgesehen ist.
Unter der Haube werden bei einigen Systemen für die Prozessersetzung intern Named Pipes verwendet. Auf den meisten Systemen werden jedoch benannte Dateien verwendet, die Dateideskriptoren darstellen .
quelle
pee
vonmoreutils
.Zumindest in der Bash können Sie
mkfifo
mit der Prozessersetzung überspringen :oder um das Beispiel von Arcege anzunehmen
quelle
Ich bin überrascht, dass niemand den
pee
Befehl von moreutils ( https://joeyh.name/code/moreutils ) erwähnt hat.quelle