Domača » kako » Kako zaženete ukaz v ozadju brez izhoda, razen če je prišlo do napake?

    Kako zaženete ukaz v ozadju brez izhoda, razen če je prišlo do napake?

    Če ste zaposlena oseba, potem je zadnja stvar, ki jo potrebujete, to, da vas moti ogromna količina "neuporabnih" obvestil, kako boste potem utišali stvari? Današnja objava za vprašanja in odgovori SuperUser ima nekaj odličnih odgovorov, ki bralcu pomagajo, da zmanjša količino izpisa.

    Današnja seja vprašanj in odgovorov prihaja z namenom SuperUser-a, ki je del skupine Stack Exchange, ki temelji na skupnostih spletnih mest za vprašanja in odgovore.

    Vprašanje

    Bralnik SuperUser Xster želi izvedeti ukaz v ozadju brez izhoda, če ni napake:

    Kako izklopite ukaz, vendar ga prikažite, če zapoved ukaza napake?

    Kako dobite ukaz za zagon v ozadju brez izhoda, razen če je prišlo do napake?

    Odgovor

    Sodelavci SuperUser Bob in Maximillian Laumeister imata odgovor za nas. Prvič, Bob:

    Na žalost, predpostavka, da stderr se uporablja samo za izpis napak, ni vedno pravilen. Precej, stderr se pogosto uporablja za vse interaktivne izhode in diagnostiko (tj. izhod, namenjen uporabniku za branje v interaktivnem pozivu).(1) wget in dd dobro znani primeri.

    Nekateri ukazi bodo zagotovili oznako (tj. -tih ali -tiho) za preprečitev izhoda brez napak. Preberite njihove strani, da vidite, ali obstaja.

    Druga konvencija, ki je pogostejša, je izhodno kodo, program vrne izhodno kodo, ko zapusti program. Značilno(2), izhodna koda 0 označuje uspeh, katera koli druga izhodna koda pa pomeni napako.

    S bash, lahko dobite izhodno kodo zadnjega ukaza iz $? spremenljivko. V ribe, uporabi $ status spremenljivko. Lahko pišete stderr v začasno datoteko in jo natisnite le, če pride do napake. Na primer (ribe):

    Uporabite lahko tudi nekatere bližnjice, če ne ujemate ukazov:

    Ali:

    Lahko tudi cev stdout v isti vmesni pomnilnik z uporabo 2> & 1> / tmp / outputbuffer.

    (Opomba: Pravzaprav ne vem ribe, zato prilagajam koncept temu, kar lahko najdem v njegovi dokumentaciji. Sintaksa je morda nekoliko napačna. Prav tako lahko uporabite mktemp ustvariti edinstveno začasno datoteko. Zaženi in zapiši ime datoteke v spremenljivki.)

    Če morate celotno stvar zagnati v ozadju lupine, ki jo hkrati uporabljate interaktivno, potem je bolje, da napišete skript za obdelavo skrita izhodnega izpisa in izvajanje tega scenarija v ozadju s standardnimi tehnikami. (ribe). Vraga, lahko vnesete nekaj takega kot naslednjo funkcijo ~ / .config / fish / config.fish:

    Pokliči z tiho upravljanje (kjer sledi & povzroči, da se izvaja v ozadju)

    Upoštevajte, da bo to iztisnilo izvirno izhodno kodo in iztisnilo obe stdout in stderr v primeru okvare. Po potrebi ga lahko prilagodite.

    (1) Ni zagotovila, da se napaka ne prikaže stdout, nekateri programi bodo tam izpisali vse podatke!

    (2) Žal to še vedno ni vedno tako. Izhodna koda je v celoti pod nadzorom programa in nekateri bodo pokazali nekatere pogoje uspeha z izhodi, ki niso ničli. Spet preverite priročnik.

    Sledi odgovor Maximillian Laumeister:

    Pripomočki Unix pošiljajo splošna sporočila stdout, in sporočila o napakah stderr, tako da, če želimo videti samo sporočila o napakah, bo zadostovalo, da ga izključimo stdout tako da samo stderr dobite izhod na konzolo.

    Način za to (v obeh bash in ribe) je treba dodati > / dev / null ukazu. Te cevi stdout v nič, toda stderr (s sporočili o napakah) še vedno pride do konzole.

    Tako na primer:

    Ukaz echo 1> / dev / null ne natisne ničesar, ker je normalno stdout izhod je potisnjen in nič ni napisano stderr.

    Ukaz man doesnotexist> / dev / null natisne sporočilo o napaki, ker človek sporočilo o napaki stderr.


    Imate kaj dodati pojasnilu? Zvok v komentarjih. Želite prebrati več odgovorov drugih uporabnikov tehnologije Stack Exchange? Oglejte si celotno nit razprave tukaj.