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
programstirbt (benutzewaitwarten) programbeendet (erhalteeofauf seiner stdin, wenn die Shell beendet wird).