Kaip paleisti komandą fone su išvestimi, nebent yra klaida?
Jei esate užimtas žmogus, paskutinis dalykas, kurį jums reikia, yra nerimauti su „nenaudingų“ pranešimų kiekiu, taigi, kaip tu nustebi? Šiandienos „SuperUser“ atsakymų ir atsakymų žinute yra keletas puikių atsakymų, padedančių skaitytojui nuraminti produkcijos kiekį.
Šiandienos „Klausimų ir atsakymų“ sesija mums suteikiama pagal „SuperUser“ - „Stack Exchange“ padalinį, bendruomenės sukurtą „Q&A“ svetainių grupavimą.
Klausimas
„SuperUser“ skaitytuvas „Xster“ nori sužinoti, kaip paleisti komandą fone be išvesties, nebent yra klaida:
Kaip slopinti komandos išvestį, bet parodyti, jei komandos išėjimo kodai yra klaida?
Kaip gausite komandą paleisti fone be išėjimo, nebent yra klaida?
Atsakymas
„SuperUser“ autoriai Bob ir Maximillian Laumeister atsako už mus. Pirma, Bob:
Deja, prielaida, kad stderr naudojamas tik klaidų išvestims, ne visada teisingas. Greičiau, stderr dažnai naudojamas bet kuriam ir visam interaktyviam išėjimui ir diagnostikai (t. y. išėjimui, skirtam naudotojui skaityti interaktyvioje eilutėje).(1) wget ir dd yra gerai žinomi pavyzdžiai.
Kai kurios komandos suteiks vėliavą (t. Y. -tyliai arba -tylus) slopinti ne klaidų išvestį. Perskaitykite jų žmogaus puslapius, kad pamatytumėte, ar toks egzistuoja.
Kita konvencija, kuri dažniau laikoma išėjimo kodas, programa išeina išėjimo kodą. Paprastai(2), išėjimo kodas 0 rodo sėkmę, o bet kuris kitas išėjimo kodas rodo klaidą.
Su bash, galite gauti paskutinio komandos išėjimo kodą iš $? kintamasis. Į žuvis, naudoti $ statusas kintamasis. Galite vamzdis stderr į laikiną failą ir spausdinti tik tada, kai įvyksta klaida. Pavyzdžiui (žuvis):
Taip pat galite naudoti kai kurias sparčiuosius klavišus, jei nesirenkate komandų:
Arba:
Taip pat galite vamzdis stdout naudojant tą patį buferį 2> & 1> / tmp / išvesties buferis.
(Pastaba: Aš nežinau žuvis, todėl pritaikau koncepciją prie to, ką galiu rasti jo dokumentuose. Sintaksė gali būti šiek tiek neteisinga. Taip pat galite naudoti mktemp sukurti unikalų laikiną failą. Paleiskite ją ir įrašykite failo pavadinimą kintamajame.)
Jei jums reikia paleisti visą dalyką apvalkalo fone, kurį taip pat naudojate interaktyviai tuo pačiu metu, tuomet geriau rašyti scenarijų, kad galėtumėte tvarkyti išėjimo paslėpimą ir paleisti šį scenarijų fone su standartiniais metodais (žuvis). Heck, galite įdėti kažką panašaus į šią funkciją ~ / .config / fish / config.fish:
Skambinkite kažką paversti tyliai ir (kur galas & sukelia jį paleisti fone)
Atkreipkite dėmesį, kad tai bus nuryti pradinį išėjimo kodą ir iškrauti abu stdout ir stderr nesėkmės atveju. Prireikus galite ją pritaikyti.
(1) Nėra jokių garantijų, kad klaidų išėjimas nebus rodomas stdout, kai kurios programos bus iškraunamos visame produkte!
(2) Deja, tai ne visuomet yra. Programa visiškai kontroliuoja išėjimo kodą, o kai kurie nurodys kai kurias sėkmės sąlygas su ne nuliniu išėjimu. Vėlgi patikrinkite vadovą.
Po to atsakė Maximillian Laumeister:
Unix komunalinės paslaugos siunčia bendrus pranešimus stdout, ir klaidų pranešimus stderr, taigi, jei norime matyti tik klaidų pranešimus, tuomet pakaks slopinti stdout kad tik stderr gauna išėjimą į konsolę.
Kaip tai padaryti (abiejuose bash ir žuvis) yra pridedamas > / dev / null į komandą. Šie vamzdžiai stdout į nieką, bet stderr (su jūsų klaidų pranešimais) vis dar patenka į konsolę.
Taigi, pavyzdžiui:
Komanda echo 1> / dev / null nieko neišspausdina, nes normalus stdout produkcija yra slopinama, ir nieko nebuvo parašyta stderr.
Komanda vyras doesnotexist> / dev / null spausdina klaidos pranešimą, nes vyras rašo klaidos pranešimą stderr.
Ar ką nors papildyti paaiškinimu? Garsas išjungtas komentaruose. Norite perskaityti daugiau atsakymų iš kitų „tech-savvy Stack Exchange“ vartotojų? Čia rasite visą diskusijų temą.