Mám program, který vytváří užitečné informace o stdout ale také čte z stdin . Chci přesměrovat jeho standardní výstup do souboru, aniž bych poskytoval cokoli na standardním vstupu. Zatím je to dobré:Zvládnu to:
program > output
a v tty nic nedělejte.
Problém je však v tom, že to chci udělat na pozadí. Pokud ano:
program > output &
program bude pozastaven („pozastaven (vstup tty)“).
Pokud ano:
program < /dev/null > output &
program se okamžitě ukončí, protože dosáhne EOF.
Zdá se, že to, co potřebuji, je zapojit se do program něco, co po neurčitou dobu nic nedělá a nečte stdin . Fungují následující přístupy:
while true; do sleep 100; done | program > output &
mkfifo fifo && cat fifo | program > output &
tail -f /dev/null | program > output &
To vše je však velmi ošklivé. má být elegantní způsob, jak pomocí standardních unixových utilit „nedělat nic, donekonečna“ (abych parafrázoval man true ). Jak bych toho mohl dosáhnout? (Moje hlavní kritéria pro eleganci zde:žádné dočasné soubory; žádné čekání nebo pravidelné probouzení; žádné exotické nástroje; co nejkratší.)
Přijatá odpověď:
V shellech, které je podporují (ksh, zsh, bash4), můžete spustit program jako společný proces.
ksh:program > output |&zsh,bash:coproc program > output
Tím se spustí program na pozadí se vstupem přesměrovaným z pipe . Druhý konec trubky je otevřený do pláště.
Tři výhody tohoto přístupu
- žádný další proces
- po
programmůžete skript ukončit zemře (použijtewaitčekat na to) programse ukončí (získáteeofna jeho stdin, pokud shell opustí).