Ich habe ein Programm, das nützliche Informationen über stdout
erzeugt liest aber auch von stdin
. Ich möchte die Standardausgabe in eine Datei umleiten, ohne etwas auf der Standardeingabe bereitzustellen. So weit, so gut:Ich kann:
program > output
und tue nichts im tty.
Das Problem ist jedoch, dass ich dies im Hintergrund tun möchte. Wenn ja:
program > output &
das Programm wird angehalten („suspended (tty input)“).
Wenn ja:
program < /dev/null > output &
das Programm wird sofort beendet, weil es EOF erreicht.
Es scheint, dass ich in program
leiten muss etwas, das auf unbestimmte Zeit nichts tut und stdin
nicht liest . Die folgenden Ansätze funktionieren:
while true; do sleep 100; done | program > output &
mkfifo fifo && cat fifo | program > output &
tail -f /dev/null | program > output &
Allerdings ist das alles sehr hässlich. Es hat ein eleganter Weg zu sein, unter Verwendung von Standard-Unix-Dienstprogrammen „nichts zu tun, auf unbestimmte Zeit“ (um man true
zu paraphrasieren ). Wie könnte ich das erreichen? (Meine Hauptkriterien für Eleganz hier:keine temporären Dateien; kein geschäftiges Warten oder periodisches Aufwachen; keine exotischen Dienstprogramme; so kurz wie möglich.)
Akzeptierte Antwort:
In Shells, die sie unterstützen (ksh, zsh, bash4), können Sie program
starten als Co-Prozess.
ksh
:program > output |&
zsh
,bash
:coproc program > output
Das startet program
im Hintergrund, wobei seine Eingabe von einer pipe
umgeleitet wird . Das andere Ende des Rohrs ist zum Gehäuse hin offen.
Drei Vorteile dieses Ansatzes
- kein zusätzlicher Prozess
- Sie können das Skript beenden, wenn Sie
program
stirbt (benutzewait
warten) program
beendet (erhalteeof
auf seiner stdin, wenn die Shell beendet wird).