So leiten Sie stdout von rechts nach links um

So leiten Sie stdout von rechts nach links um

Das funktioniert perfekt:

./foo | ./bar

Aber ich hätte gerne so etwas:

./bar <| ./foo

So kann ich die Weiterleitung in die andere Richtung durchführen und die Argumente von foo in der Befehlszeile schneller ändern.

Die Pipe muss in Echtzeit erfolgen – mein fooProgramm kehrt nie zurück.

Ist das möglich ?

Antwort1

Eine einfache und korrekte Möglichkeit kann die Definition einer Foobar-Funktion sein.

foobar () { ./foo "$@" | ./bar ; }

(entweder in der Befehlszeile, je nach Bedarf, oder in einigen Startskripten, wie z. B. „.bashrc“). Dann, wann immer Sie Folgendes tun:

foobar "this"  that   "and this also"

Das wird klappen

./foo  this   that   "and this also" | ./bar

Antwort2

./bar < <( ./foo )

Zum Beispiel:cat < <(echo "hello there!")

Um zu verstehen, wie es funktioniert, betrachten Sie Teile des Skripts einzeln.

Diese Syntax: cat < /path/to/fileliest die Datei /path/to/fileund leitet sie als Standardeingabe an weiter cat.

Diese Syntax <(echo "hello there!")bedeutet, den Befehl auszuführen und die Standardausgabe an einen Dateideskriptor wie anzuhängen /dev/fd/65. Das Ergebnis des gesamten Ausdrucks ist ein Text wie /dev/fd/65und ein parallel ausgeführter Befehl, der diesen Dateideskriptor speist.

Jetzt führt das Skript in kombinierter Form den rechten Befehl aus, leitet ihn an einen Dateideskriptor weiter, konvertiert diesen Dateideskriptor für den linken Befehl in stdin und führt den linken Befehl aus.

Es gibt keinen mir bekannten Overhead, es ist genau dasselbe wie a | b, nur syntaktischer Zucker.

Antwort3

Ich denke, Sie könnten so etwas mit einer benannten Pipe tun:

mypipe=$(mktemp -d /tmp/XXXXXX)/pipe
mkfifo $mypipe
grep something < $mypipe & tail > $mypipe -f  some_input_file 
rm $mypipe

oder fügen Sie den unveränderlichen Teil des Befehls in ein Shell-Skript ein:

./foo "$@" | ./bar

und geben Sie die Argumente in foodie Skript-Befehlszeile ein:

./myscript <args to foo>

verwandte Informationen