GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie kann man auf elegante Weise für immer nichts tun?

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 (benutze wait warten)
  • program beendet (erhalte eof auf seiner stdin, wenn die Shell beendet wird).

Linux
  1. So speichern Sie die Befehlsausgabe in einer Datei unter Linux

  2. So beenden Sie einen Thread in einem C-Programm (Beispiel pthread_exit)

  3. Wie kann ich die Ausgabe von du -h nach Größe sortieren?

  4. So grep ps-Ausgabe mit Headern

  5. Wie stoppe ich die Ping-Ausgabe?

So weisen Sie einer Variablen die Ausgabe eines Linux-Befehls zu

Wie kann man jedes Programm mit dem Tee-Befehl zum Laufen bringen?

Gewusst wie:Einführung in die Programmierung – Flusssteuerung

Geniale Möglichkeiten zum Ausführen eines Programms unter Linux

Wie man ein C-Programm unter Linux schreibt und ausführt

So sortieren Sie diese Ausgabe 1,10,11..2