19Aug
Ak ste zaneprázdnená osoba, potom posledná vec, ktorú potrebujete, je obťažovať sa obrovským množstvom "zbytočných" upozornení, a ako to môžete zmierniť?Dnešný príspevok SuperUser Q & A má niekoľko skvelých odpovedí, ktoré pomôžu čitateľovi znižovať množstvo výstupu.
Dnešná otázka &Odpoveď na zasadnutie nám príde s láskavým dovolením SuperUser - subdivíziu Stack Exchange, komunitne riadeného zoskupenia webových stránok Q & A.
Otázka
Čítačka SuperUser Xster chce vedieť, ako spustiť príkaz na pozadí bez výstupu, pokiaľ sa nevyskytne chyba:
Ako potláčíte výstup príkazu, ale ukážte mu, či príchod príkazu kóduje chybu?
Ako dostanete príkaz na spustenie na pozadí bez výstupu, pokiaľ sa nevyskytne chyba?
Odpovede
SuperUser prispievatelia Bob a Maximillian Laumeister majú odpoveď pre nás. Po prvé, Bob:
Bohužiaľ predpoklad, že stderr sa používa len na výstup chyby nie je vždy správny. Skôr stderr sa často používa pre všetky a všetky interaktívne výstupy a diagnostiku( t. J. Výstup určený pre používateľa na čítanie v interaktívnom výzve).
( 1) wget a dd sú dobre známe príklady.Niektoré príkazy budú obsahovať príznak( t. J. -quiet alebo -silent ) na potlačenie výstupu bez chyby. Prečítajte si ich stránky mana, aby ste zistili, či existuje.
Ďalšou konvenciou, ktorá sa vyskytuje častejšie, je kód výstupu , program vráti kód ukončenia pri jeho ukončení.Typicky ( 2) , výstupný kód 0 označuje úspech a akýkoľvek iný kód ukončenia označuje chybu.
S bash môžete získať kód ukončenia posledného príkazu z $? premenná.V ryby použite premennú $ . stderr môžete nasmerovať na dočasný súbor a vytlačiť ho len v prípade výskytu chyby. Napríklad( ryby ):
Môžete použiť aj niektoré klávesové skratky, ak nie ste príkazy reťazenia:
Alebo:
stdout môžete tiež potopiť do rovnakej vyrovnávacej pamäte pomocou 2 & gt;Výstupný /tmp/ .
( Poznámka: V skutočnosti neviem, ryby , takže som sa prispôsobiť koncept na to, čo môžem nájsť vo svojej dokumentácii. Táto syntax môže byť trochu zle. Tiež môžete použiť mktemp vygenerovať jedinečné dočasnéSpustite ho a zaznamenajte názov súboru v premennej.)
Ak potrebujete spustiť celú vec na pozadí shellu, ktorý používate interaktívne súčasne, je lepšie písať skript na spracovanievýstup-skrývanie a spustenie tohto skriptu na pozadí so štandardnými technikami( ryby ).Heck, v ~ /.config/fish/ môžete umiestniť niečo ako nasledujúcu funkciu: config.fish :
Volanie s run-silent somecommand &( kde koncové a spôsobuje jeho spustenie na pozadí)
Všimnite si, že toto prehltne pôvodný kód výstupu a vyradí oba stdout a stderr v prípade zlyhania. Môžete ho prispôsobiť podľa potreby.
( 1) Neexistuje žiadna záruka, že chyba výstup nezobrazí na stdout , niektoré programy budú výpis všetky výstup tam!
( 2) Bohužiaľ, stále to tak nie je vždy. Výstupný kód je úplne kontrolovaný programom a niektoré ukazujú niektoré podmienky úspešnosti s nenulovými výstupmi. Znova skontrolujte príručku.
Nasledujúca odpoveď od Maximilliana Laumeistera:
Unixové nástroje posielajú všeobecné správy stdout a chybové hlásenia stderr , takže ak chceme len zobraziť chybové hlásenia, stačí potlačiť stdout tak, abyiba stderr dostane výstup do konzoly.
Spôsob, ako to urobiť( v oboch bash a ryby ) je pridať & gt;/dev/ null k príkazu. Toto potrubie stdout do ničoty, ale stderr ( s vašimi chybovými správami) stále prechádza do konzoly.
Takže napríklad:
Príkaz echo 1 & gt;/dev/ null nevytlačí nič, pretože normálny výstup stdout je potlačený a nič nebolo zapísané do stderr .
Príkaz man doesnotexist & gt;/dev/ nula vytlačí chybové hlásenie, pretože človek píše svoju chybovú správu stderr .
Musíte niečo doplniť k vysvetleniu? Znížte komentáre. Chcete si prečítať viac odpovedí od iných používateľov technológie Stack Exchange? Pozrite sa na celý diskusný príspevok tu.