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
program
můžete skript ukončit zemře (použijtewait
čekat na to) program
se ukončí (získáteeof
na jeho stdin, pokud shell opustí).