GNU/Linux >> Znalost Linux >  >> Linux

Patří zprávy o pokroku/protokolované informace na Stderr nebo Stdout?

Existuje oficiální POSIX, GNU nebo jiná směrnice o tom, kde by se měly tisknout zprávy o pokroku a informace o protokolování (věci jako „Doing foo; foo done“)? Osobně mám tendenci je zapisovat do stderr, abych mohl přesměrovat stdout a získat pouze skutečný výstup programu. Nedávno mi bylo řečeno, že to není dobrá praxe, protože zprávy o pokroku ve skutečnosti nejsou chyby a na stderr by se měly tisknout pouze chybové zprávy.

Obě polohy dávají smysl a samozřejmě si můžete vybrat jednu nebo druhou v závislosti na detailech toho, co děláte, ale rád bych věděl, zda pro to existuje běžně přijímaný standard. Nepodařilo se mi najít žádná konkrétní pravidla v POSIXu, standardech kódování GNU ani v jiných takto široce přijímaných seznamech osvědčených postupů.

Máme několik podobných otázek, ale neřeší přesně tento problém:

  • Kdy použít přesměrování na stderr ve skriptech shellu:Přijatá odpověď naznačuje, co mám tendenci dělat, ponechat konečný výstup programu na stdout a cokoli jiného na stderr. Toto je však pouze prezentováno jako názor uživatele, i když podložený argumenty.

  • Má zpráva o použití přejít na stderr nebo stdout?:Toto je specifické pro zprávy nápovědy, ale cituje standard kódování GNU. To je ten druh věcí, které hledám, ale neomezují se pouze na zprávy nápovědy.

Existují tedy nějaká oficiální pravidla pro to, kde by se měly tisknout zprávy o průběhu a další informativní zprávy (které nejsou součástí skutečného výstupu programu)?

Přijatá odpověď:

Posix definuje standardní toky takto:

Při spouštění programu musí být předdefinovány tři proudy a není třeba je explicitně otevírat:standardní vstup (pro čtení konvenčního vstupu), standardní výstup (pro zápis konvenčního výstupu) a standardní chyba (pro zápis diagnostického výstupu). Při otevření není standardní chybový proud plně ukládán do vyrovnávací paměti; standardní vstupní a standardní výstupní toky jsou plně ukládány do vyrovnávací paměti tehdy a pouze tehdy, pokud lze určit, že tok neodkazuje na interaktivní zařízení.

Knihovna GNU C popisuje standardní toky podobně:

Proměnná:FILE * stdout
Standardní výstupní proud, který se používá pro normální výstup z programu.

Proměnná:FILE * stderr
Standardní tok chyb, který se používá pro chybová hlášení a diagnostiku vydávaná programem.

Standardní definice tedy mají jen málo vodítek pro použití streamu nad rámec „konvenčního/normálního výstupu“ a „diagnostického/chybového výstupu“. V praxi je běžné přesměrovat jeden nebo oba tyto proudy do souborů a kanálů, kde budou indikátory průběhu problémem. Některé systémy dokonce monitorují stderr pro výstup a považovat to za známku problémů. Čistě pomocné informace o průběhu jsou proto problematické u obou streamů.

Související:Ubuntu – /usr/bin/host nezískává změny v /etc/hosts ani po restartu?

Místo toho, abyste bezpodmínečně zasílali ukazatele průběhu obě standardní stream, je důležité si uvědomit, že výstup průběhu je vhodný pouze pro interaktivní proudy. S ohledem na to doporučuji zapisovat počítadla průběhu až po kontrole, zda je stream interaktivní (např. pomocí isatty() ) nebo když je to explicitně povoleno volbou příkazového řádku. To je zvláště důležité pro měřiče průběhu, které se spoléhají na to, že mají smysl aktualizovat chování terminálu, jako jsou úsečky s % dokončení.

U určitých velmi jednoduchých zpráv o průběhu („Starting X“ … „Done with X“) je rozumnější zahrnout výstup i pro neinteraktivní streamy. V takovém případě zvažte, jak by uživatelé mohli komunikovat se streamy, jako je vyhledávání pomocí grep nebo stránkování pomocí less nebo monitorování pomocí tail -f . Pokud má smysl vidět zprávy o pokroku v těchto kontextech, bude mnohem snazší je konzumovat z stdout .


Linux
  1. Jak přesměrovat výstup do souboru a Stdout v Linuxu

  2. Co znamená propojení Stdout a Stdin?

  3. Příkaz pro výstup obsahu souboru do Stdout?

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

  2. Jak přesměrovat stderr a stdout na různé soubory ve stejném řádku ve skriptu?

  3. Python - Vedoucí, jak protokolovat standardní výstup -

  1. Nakonfigurovat Shell pro tisk Stderr a Stdout v různých barvách?

  2. Jak zjistit, zda je výstup příkazového nebo shellového skriptu Stdout nebo Stderr?

  3. Proč výstup některých linuxových programů nejde ani do STDOUT, ani do STDERR?