Úvodná » ako » Ako spustiť príkaz v pozadí bez výstupu, ak sa nevyskytla chyba?

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

    Ak ste zaneprázdnený človek, 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á relácia otázok a odpovedí sa k nám pridelí zdvorilosťou SuperUser - podskupiny Stack Exchange, zoskupenia webových stránok typu Q & A.

    Otázka

    Čítačka SuperUser Xster chce vedieť, ako spustiť príkaz na pozadí bez výstupu, pokiaľ nie je chyba:

    Ako potlačujete výstup príkazu, ale ukážte mu, či ukončenie príkazu kóduje chybu?

    Ako dostanete príkaz na spustenie na pozadí bez výstupu, ak nie je chyba?

    Odpoveď

    Sponzori SuperUser Bob a Maximillian Laumeister majú odpoveď pre nás. Po prvé, Bob:

    Bohužiaľ, predpoklad, že stderr sa používa len na chybový výstup nie je vždy správny. trochu, stderr sa často používa pre ľubovoľný interaktívny výstup a diagnostiku (t.j. výstup určený používateľovi na čítanie v interaktívnom výzve).(1) wget a dd sú dobre známe príklady.

    Niektoré príkazy budú obsahovať príznak (napr. -tichý alebo -tichý) 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 výstupný kód, program vráti kód ukončenia, keď sa ukončí. typicky(2), výstupný kód 0 označuje úspech a akýkoľvek iný kód ukončenia označuje chybu.

    s tresnúť, môžete získať kód ukončenia posledného príkazu z $? variabilné. v ryby, Použi stav $ variabilné. Môžete potrubie stderr do dočasného súboru a vytlačte ho len v prípade, že sa vyskytne chyba. Napríklad (ryby):

    Môžete tiež použiť nejaké klávesové skratky, ak nie ste reťazové príkazy:

    alebo:

    Môžete tiež potrubie stdout do rovnakej vyrovnávacej pamäte pomocou 2> & 1> / tmp / outputbuffer.

    (Poznámka: V skutočnosti neviem ryby, preto prispôsobujem koncept tomu, čo môžem nájsť vo svojej dokumentácii. Syntax môže byť mierne nesprávny. Tiež môžete použiť mktemp generovať jedinečný dočasný súbor. Spustite ho a zaznamenajte názov súboru v premennej.)

    Ak potrebujete spustiť celú vec na pozadí shellu, ktorý zároveň používate interaktívne súčasne, je lepšie písať skript na spracovanie výstupu - skrytie a spúšťanie tohto skriptu na pozadí so štandardnými technikami (ryby). Heck, môžete vložiť niečo ako nasledujúcu funkciu ~ / .Config / ryby / config.fish:

    Zavolajte s run-silent somecommand & (kde koncový & spôsobí jeho spustenie na pozadí)

    Všimnite si, že toto bude prehĺtať pôvodný kód výstupu a obidve stdout a stderr v prípade zlyhania. Môžete to prispôsobiť podľa potreby.

    (1) Neexistuje žiadna záruka, že sa chybový výstup nezobrazí stdout, niektoré programy vyradia všetky výstupy tam!

    (2) Bohužiaľ, stále to tak nie je vždy. Výstupný kód je úplne kontrolovaný programom a niektoré uvádzajú niektoré podmienky úspešnosti s nenulovými výstupmi. Znova skontrolujte príručku.

    Nasledovala odpoveď od Maximilliana Laumeistera:

    Pomôcky Unix posielajú všeobecné správy stdout, a chybové hlásenia stderr, takže ak chceme vidieť iba chybové hlásenia, stačí to potlačiť stdout takže len stderr dostane výstup do konzoly.

    Spôsob, ako to urobiť (v oboch tresnúť a ryby) je pripojiť > / Dev / null na príkaz. Toto potrubie stdout do ničoty, ale stderr (s chybovými správami) stále prechádza do konzoly.

    Napríklad:

    Príkaz echo 1> / dev / null nevytlačí nič, pretože normálne stdout výstup je potlačený a nič nie je napísané stderr.

    Príkaz človek doesnotexist> / dev / null vytlačí chybovú správu, pretože muž píše svoje chybové hlásenie stderr.


    Máte niečo doplniť vysvetlenie? Znie to v komentároch. Chcete sa dozvedieť viac odpovedí od iných používateľov technickej úrovne Stack Exchange? Pozrite sa na celý diskusný príspevok tu.