19Aug

Ako spustiť príkaz na pozadí bez výstupu, ak sa nevyskytne chyba?

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.