
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 foo
Programm 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/file
liest die Datei /path/to/file
und 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/65
und 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 foo
die Skript-Befehlszeile ein:
./myscript <args to foo>