Ich habe ein Programm P
, das erwartet, "Hallo" zu empfangen und "Warum?" bevor Sie eine Funktion bereitstellen. Diese Funktion wird von anderen Programmen verwendet, die nicht wissen, dass es üblich ist, ein Gespräch mit "Hallo" zu beginnen. Ich möchte also einen Wrapper dafür schreiben P
, der so funktioniert (zsh-Syntax):
coproc P
print -p Hello # Send Hello to P
read -pr line # Read what P has to say
[[ "$line" = "Why?" ]] && Replace current process with the coprocess.
echo Could not get P's attention.
Die Verwendung von cat
oder dd
in dem Replace...
Teil (so etwas wie cat <&p &; exec cat >&p
) führt zu unnötiger Pufferung. Was sind meine Optionen?
zsh
Lösung oder ist einebash
Lösung akzeptabel?bash
Lösung, die in nicht anwendbar istzsh
, aber sie sicherlich akzeptieren würde ☺ssh
und seine OptionProxyCommand
.cat
puffert im Allgemeinen nicht. Wenn dies auf Ihrem System der Fall ist, versuchen Sie escat -u
.Antworten:
Das Problem, das Sie angegeben haben, besteht nicht darin, einen Prozess zu ersetzen, sondern die Streams eines vorhandenen Prozesses zu ersetzen . Das Ziel ist es, ein wenig mit dem Prozess zu interagieren und dann seine Eingabe / Ausgabe an ein anderes Paar verbundener Streams zu übergeben.
Es gibt keine Möglichkeit, dies direkt zu tun (zumindest in der Shell; innerhalb des Prozesses
dup2
könnte ein Aufruf möglicherweise funktionieren). Sie müssen die Streams spleißen. Dh:Die Verwendung
coproc
wie in Ihrem Beispiel ist ebenfalls in Ordnung. Beachten Sie, dass der Befehl die Dateideskriptoren in einem Array speichert und Sie sie später für Umleitungen verwenden können.Dies sollte keine zusätzliche Pufferung verursachen (zumindest bei GNU cat), es sei denn, P überprüft die Eingangs- / Ausgangsströme, mit denen es verbunden ist, und trifft eine Entscheidung, basierend darauf zu puffern. Beispielsweise aktiviert die C-Standardbibliothek die Pufferung für
stdout
/,stderr
wenn sie mit einer Datei verbunden sind, führt jedoch nur eine Zeilenpufferung durch, wenn sie mit einem Terminal verbunden sind.quelle
Versuchen Sie, mit dem folgenden Code mit Perl zu testen, um Pufferung zu vermeiden. Versuchen Sie, ob dies für Sie funktioniert
quelle
dd ibs=1
. Ich bin damit nicht einverstanden. In gewisser Weise hat der Coproc eine eigene Pufferung, und diese möchte ich verwenden.