Ich habe ein Programm, das beim Lesen eines EOF in einem bestimmten Stream automatisch beendet wird (im folgenden Fall stdin).
Jetzt möchte ich ein Shell-Skript erstellen, das eine Named Pipe erstellt und den Standard des Programms damit verbindet. Anschließend schreibt das Skript mehrmals mit echo
und cat
(und anderen Tools, die beim Beenden automatisch einen EOF generieren) in die Pipe . Das Problem, mit dem ich konfrontiert bin, ist, dass wenn das erste echo
erledigt ist, ein EOF an die Pipe gesendet wird und das Programm beendet wird. Wenn ich so etwas verwende, kann tail -f
ich keine EOF senden, wenn ich beabsichtige, das Programm zu beenden. Ich suche nach einer ausgewogenen Lösung, aber ohne Erfolg.
Ich habe bereits herausgefunden, wie man EOFs verhindert und wie man einen EOF manuell sendet, aber ich kann sie nicht kombinieren. Gibt es einen Hinweis?
#!/bin/sh
mkfifo P
program < P & : # Run in background
# < P tail -n +1 -f | program
echo some stuff > P # Prevent EOF?
cat more_stuff.txt > P # Prevent EOF?
send_eof > P # How can I do this?
# fg
exec 3>P
Ursache hängen in Bash, warum?exec 2>P
und den Trace-Modus aktiviert haben (set -x
), in dem Bash in die Pipe schreiben wird, aber es gibt keinen Leser, so dass das Warten blockiert etwas zu lesen.exec 3>P
hängt in Bash auch auf meinem Computer. Dies liegt daran, dass kein Prozess von gelesen wirdP
. Daher bestand die Lösung darin, Zeilen auszutauschenexec 3>P
undprogram < P &
(das kaufmännische Und hinzuzufügen, damit das Programm im Hintergrund ausgeführt wird).Eine Pipe erhält EOF, wenn der letzte Schreiber weggeht. Um dies zu vermeiden, stellen Sie sicher, dass immer ein Writer vorhanden ist (ein Prozess, bei dem die Pipe zum Schreiben geöffnet ist, der jedoch nichts schreibt). Um die EOF zu senden, lassen Sie diesen Reserveschreiber verschwinden.
quelle
Es gibt keine Möglichkeit für das Programm, zwischen einer EOF zu unterscheiden, die "es ist Zeit zu beenden" bedeutet, und einer EOF, die bedeutet, dass "ein Autor fertig ist, aber möglicherweise mehr Eingaben von jemand anderem".
Wenn Sie das Verhalten Ihres Programms ändern können, lesen Sie in einer Endlosschleife (eine Iteration dauert bis EOF) und senden Sie eine bestimmte Befehlszeichenfolge, die "Zeit zum Beenden" bedeutet. Das Senden dieser Zeichenfolge wäre die Aufgabe des
send_eof
Befehls in Ihrer Frage.Andere Option:
oder
quelle