Das funktioniert perfekt:
./foo | ./bar
Aber ich möchte so etwas:
./bar <| ./foo
So kann ich umgekehrt herumleiten und die Argumente von foo in der Befehlszeile schneller ändern.
Die Pipe muss in Echtzeit sein - mein foo
Programm kehrt nie zurück.
Ist das möglich ?
./bar <(./foo)
./bar < <(./foo)
wennbar
ist ein Skript.Antworten:
Zum Beispiel:
cat < <(echo "hello there!")
Um zu verstehen, wie es funktioniert, betrachten Sie Teile des Skripts separat.
Diese Syntax:
cat < /path/to/file
liest die Datei/path/to/file
und leitet sie als Standard an weitercat
.Diese Syntax:
<(echo "hello there!")
bedeutet, den Befehl auszuführen und das stdout an einen Dateideskriptor wie anzuhängen/dev/fd/65
. Das Ergebnis des gesamten Ausdrucks ist ein Text wie/dev/fd/65
und ein Befehl, der parallel ausgeführt wird und diesen Dateideskriptor speist.Zusammen führt das Skript nun 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 Overhead, von dem ich wissen würde, es ist genau das gleiche wie
a | b
nur syntaktischer Zucker.quelle
Ein einfacher und richtiger Weg kann darin bestehen, eine Foobar-Funktion zu definieren.
(entweder in der Befehlszeile nach Bedarf oder in einigen Startskripten, wie z. B. ".bashrc"). Wann immer Sie dies tun:
Das wird reichen
quelle
foobar() { printf '%s\n' -x "$1" -y "$2" blah blah "${@:3}" | grep -v 123; }; foobar a b abc 'cd ef'
. So können Sie die Funktionsdefinition leicht anpassen, wenn Sie an etwas anderes denken. ("${@:3}"
Erweitert sich auf die Positionsparameter beginnend mit 3 und überspringt die beiden bereits verwendeten.)local IFS=
in einer Funktion tun und einige Variablen basierend auf den Funktionsargumenten berechnen.Ich denke, Sie könnten so etwas mit einer Named Pipe machen:
oder fügen Sie den unveränderlichen Teil des Befehls in ein Shell-Skript ein:
und geben Sie die Argumente in
foo
der Skriptbefehlszeile an:quelle