Miten suoritat komennon taustalla, jolla ei ole tulostusta Jos ei ole virhettä?
Jos olet kiireinen henkilö, viimeinen asia, jota tarvitset, on vaivautua valtavan määrän "hyödyttömiä" ilmoituksia, joten miten rauhoittat asiat? Tämän päivän SuperUser Q&A -postissa on hyviä vastauksia, jotka auttavat lukijaa rauhoittamaan tuotoksen määrää.
Nykypäivän Kysymys- ja vastaus -istunto tulee meille suotuisasti SuperUserin - Stack Exchange -alueen, yhteisöpohjaisen Q & A-sivustojen ryhmittymän - kautta..
Kysymys
SuperUser-lukija Xster haluaa tietää, miten komentoa voidaan suorittaa taustalla, jossa ei ole tulostusta, ellei virhe ole:
Miten voit estää komennon lähdön, mutta näyttää sen, jos komennon poistumiskoodit ovat virhe?
Miten saat käskyn, joka suoritetaan taustalla ilman tulostusta, ellei virhe ole?
Vastaus
SuperUserin avustajilla Bob ja Maximillian Laumeister ovat vastaus meille. Ensinnäkin, Bob:
Valitettavasti oletus, että stderr käytetään vain virheilmoitukseen ei aina ole oikein. pikemminkin, stderr käytetään usein mihin tahansa interaktiiviseen ulostuloon ja diagnostiikkaan (eli tuotokseen, joka on tarkoitettu käyttäjän lukemaan interaktiivisessa kehyksessä).(1) wget ja dd ovat hyvin tunnettuja esimerkkejä.
Jotkin komennot tarjoavat lipun (ts. -hiljainen tai -hiljainen) tukahduttaa ei-virheen tulostus. Lue niiden man-sivut, jos haluat nähdä, onko sellainen olemassa.
Toinen yleissopimus, joka pitää useammin, on poistumiskoodi, ohjelma palauttaa poistumiskoodin, kun se poistuu. Tyypillisesti(2), poistumistunnus 0 osoittaa menestystä, ja mikä tahansa muu poistumiskoodi ilmaisee virheen.
Kanssa lyödä, voit saada viimeisen komennon poistokoodin $? muuttuja. Sisään kalastaa, Käytä $ tila muuttuja. Voit putata stderr väliaikaiseen tiedostoon ja tulosta se vain, jos tapahtuu virhe. Esimerkiksi (kalastaa):
Voit myös käyttää joitakin pikakuvakkeita, jos et ketjoita komentoja:
Tai:
Voit myös putkia stdout samaan puskuriin käyttämällä 2> & 1> / tmp / lähdepuskuri.
(Huomautus: En todellakaan tiedä kalastaa, joten mukautan käsitettä siihen, mitä löydän sen asiakirjoista. Syntaksi voi olla hieman väärin. Voit myös käyttää mktemp luoda ainutlaatuinen väliaikainen tiedosto. Suorita se ja tallenna tiedoston nimi muuttujaan.)
Jos sinun on suoritettava koko asia kuoren taustalla, jota käytät myös vuorovaikutteisesti samanaikaisesti, sinun on parempi kirjoittaa kirjoitus, joka käsittelee lähdön piilottamista ja käynnissä olevaa skriptiä taustalla standarditekniikalla (kalastaa). Heck, voit laittaa jotain seuraavaan toimintoon ~ / .Config / kala / config.fish:
Soita numeroon juoksee hiljaa ja (missä takana & aiheuttaa sen juosta taustalla)
Huomaa, että tämä nielee alkuperäisen poistokoodin ja tyhjentää molemmat stdout ja stderr epäonnistumisen yhteydessä. Voit muokata sitä tarpeen mukaan.
(1) Ei ole mitään takeita siitä, että virheilmoitus ei tule näkyviin stdout, jotkin ohjelmat tyhjentävät kaikki tuotokset siellä!
(2) Valitettavasti näin ei ole aina. Ohjelma ohjaa täysin poistokoodia ja jotkut osoittavat joitakin onnistumisolosuhteita, joissa ei ole nollaa. Tarkista jälleen käsikirja.
Seurauksena on Maximillian Laumeisterin vastaus:
Unix-apuohjelmat lähettävät yleisiä viestejä stdout, ja virheilmoitukset stderr, joten jos haluamme vain nähdä virheilmoituksia, se riittää tukahduttamaan stdout niin että vain stderr saa lähdön konsoliin.
Tapa tehdä tämä (molemmissa lyödä ja kalastaa) on tarkoitus lisätä > / Dev / null komentoon. Tämä putki stdout ei mitään, mutta stderr (virheilmoitusten kanssa) tulee edelleen konsoliin.
Joten esimerkiksi:
Käsky echo 1> / dev / null tulostaa mitään, koska normaali stdout tuotos on tukahdutettu, eikä mitään kirjoitettu stderr.
Käsky mies doesnotexist> / dev / null tulostaa virheilmoituksen, koska mies kirjoittaa virheilmoituksensa stderr.
Onko jotain lisättävää selitykseen? Ääni pois kommenteista. Haluatko lukea lisää vastauksia muilta tech-savvy Stack Exchange -käyttäjiltä? Tutustu koko keskusteluketjuun täällä.