GNU/Linux >> Znalost Linux >  >> Linux

Jak nedělat nic navždy elegantním způsobem?

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é. 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žijte wait čekat na to)
  • program se ukončí (získáte eof na jeho stdin, pokud shell opustí).

Linux
  1. Jak přiřadit výstup příkazu Linux k proměnné

  2. Jak seřadit výstup Du podle velikosti?

  3. Jak ukončit vlákno v programu C ( příklad pthread_exit )

  1. Jak přesměrovat výstup programu do souboru ZIP?

  2. Jak se program rozhodne, zda bude či nebude mít barevný výstup?

  3. Jak zajistit, aby jakýkoli program fungoval s příkazem Tee?

  1. Zavření standardního výstupu (>&-)?

  2. Jak si zapamatovat Jak používat přesměrování?

  3. Jak přesměrovat výstup programu jako jeho vstup