19Aug

Miten voit suorittaa komennon taustalla ilman tuottoa, ellei virhe ole?

Jos olet kiireinen henkilö, niin viimeinen asia mitä tarvitset on häiritä valtava määrä "hyödytön" ilmoituksia, niin miten hiljaa asioita alas? Päivän SuperUser Q & A -postilla on hienoja vastauksia, joiden avulla lukija hiljentää tuotoksen määrää.

Päivän kysymys &Vastausistunto tulee meille kohteliaasti SuperUser-osastoon Stack Exchange, yhteisöllinen ryhmittely Q & A verkkosivuilla.

Kysymys

SuperUser-lukija Xster haluaa tietää, miten komentaa taustalla ilman tuottoa, ellei ole virhettä:

Kuinka estät komennon lähdön, mutta näytä, jos komennon poistokoodit ovat virheitä?

Miten saat komennon toimimaan taustalla ilman tuottoa, ellei ole virheitä?

Vastaus

SuperUser-avustajat Bob ja Maximillian Laumeister ovat meille vastauksemme. Ensin ylös, Bob:

Valitettavasti oletus, että stderr käytetään vain virheen tuottamiseen, ei aina ole oikein. Pikemminkin stderr käytetään usein mihinkään ja kaikkiin interaktiivisiin lähdöihin ja diagnostiikkaan( toisin sanoen käyttäjälle tarkoitetun lähdön lukemiseen interaktiivisessa kehotteessa).

( 1) wget ja dd ovat tunnettuja esimerkkejä.

Joissakin komennoissa on lippu( eli -quiet tai -silentti ), joka estää ei-virhetulostuksen. Lue heidän man sivuillaan, onko olemassa.

Toinen yleiskäyttöinen yleiskonferenssi on -poistumiskoodi , ohjelma palauttaa poistumiskoodin, kun se poistuu. Tyypillisesti ( 2) , 0 : n poistokoodi osoittaa menestystä, ja mikä tahansa muu poistumiskoodi ilmoittaa virheen.

bash : llä saat viimeisen komennon exit-koodin $: sta? muuttuja. -kaloissa , käytä $ status -muuttujaa. Voit asentaa stderr väliaikaiseen tiedostoon ja tulostaa sen vain, jos tapahtuu virhe. Esimerkiksi( kala ):

Voit käyttää myös joitain oikoteitä, jos et ole ketjutuskomentoja:

Tai:

Voit myös putkea stdout samalle puskurille käyttämällä 2 & 1 & gt;/tmp/-lähtöpuskuri .

( ) Huomaa: En todellakaan tunne kalaa , joten mukautan konseptia siihen, mitä löydän sen dokumentoinnissa. Syntaksi voi olla hieman väärä.Sinun voit käyttää mktemp luoda ainutlaatuinen väliaikainen

Jos haluat käyttää koko asiaa kuoren taustalla, jota käytät myös vuorovaikutteisesti samanaikaisesti, sinun on parasta käsitellä käsikirjoitusta käsittelemäänlähdön piilottaminen ja käynnissä oleva skripti taustalla standardimenetelmillä( kala ).Heck, voit laittaa jotain seuraavanlaista toimintoa ~ /.config/fish/ config.fish :

Soita run-hiljainen somecommand &( jossa jäljellä oleva ja aiheuttavat sen toiminnan taustalla)

Huomaa, että tämä heikentää alkuperäistä poistumiskoodia ja tyhjentää sekä stdout : n että stderr : n vian sattuessa. Voit muokata sitä tarpeen mukaan.

( 1) Ei ole takeita siitä, että stdout : n virhetoimitus ei näy, jotkut ohjelmat poistavat kaikki tuotokset siellä!

( 2) Valitettavasti tämä ei ole aina aina mahdollista. Ohjelma ohjasi poistumiskoodin kokonaan, ja jotkut osoittavat menestysolosuhteita nollasta poikkeavilla poistumisilla. Tarkista myös käsikirja.

Seuraavat Maximillian Laumeisterin vastaukset:

Unix-apuohjelmat lähettävät yleisiä viestejä stdout : lle ja virheilmoituksia stderr : hen, joten jos haluamme vain nähdä virheilmoituksia, riittää suppressoimaan stdout niin, ettävain stderr saa ulostulon konsoliin.

Tämä tapa on( sekä bash että kala ) on liittää & gt;/dev/ nolla komennolle. Tämä putki stdout osaksi mitään, mutta stderr ( kanssa virheilmoituksia) edelleen kulkee konsoli.

Esimerkiksi:

Komento echo 1 & gt;/dev/ null ei tulosta mitään, koska normaali stdout -toisto on tukahdutettu eikä mikään kirjoitettu stderr : lle.

Komento man doesnotexist & gt;/dev/ null tulostaa virheilmoituksen, koska -mies kirjoittaa virheilmoituksen stderr : lle.

Onko sinulla jotain lisättävää selitystä?Kuulkaa kommentit. Haluatko lukea lisää vastauksia muilta tech-tajuilta Stack Exchange-käyttäjiltä?Katso koko keskusteluketju täältä.