19Aug

Kaip paleisti komandą fone be rezultatų, jei nėra klaidos?

Jei esate užsiėmęs žmogus, tai paskutinis dalykas, kurio jums reikia, turi būti nuliūdęs didžiulį "nenaudingų" pranešimų kiekį, taigi, kaip jūs švelniai sutinkate?Šiandien "SuperUser" Q & įrašas turi keletą puikių atsakymų, kad padėtų skaitytojui sumažinti produkcijos kiekį.

Šiandienos klausimas &Atsakymų sesija ateina pas mus iš "SuperUser" - "Stack Exchange", bendruomenės pagrįstos "Q & A" svetainių grupės pasidalijimo.

Klausimas

SuperUser skaitytuvas Xster nori žinoti, kaip paleisti komandą fone be išvesties, nebent yra klaida:

Kaip slopina komandų išvestį, bet parodyti, jei komandų išeitis koduoja klaidą?

Kaip gaunate komandą paleisti fone be rezultatų, jei nėra klaidos?

Atsakymas

"SuperUser" autoriai Bobas ir Maximillian Laumeister atsakė už mus. Pirmiausia, Bob:

Deja, prielaida, kad stderr naudojamas tik klaidų išvedimui, ne visada yra teisinga. Greičiau stderr dažnai naudojamas bet kuriai ir visiems interaktyvioms išvesties ir diagnostikos priemonėms( t. Y. Produkcijai, skirta vartotojui perskaityti interaktyvioje eilutėje).

( 1) wget ir dd yra gerai žinomi pavyzdžiai.

Kai kurioms komandoms bus suteikta vėliava( t. Y. -kieta arba -aksesuarė ), kad būtų užkirstas kelias be klaidų.Perskaitykite jų meniu puslapius, kad sužinotumėte, ar jie egzistuoja

Kita dažniausiai laikoma išėjimo kodo programa, kai programa išeina iš programos, grąžina išeitinį kodą.Paprastai ( 2) , 0 išėjimo kodas rodo sėkmę, o bet koks kitas išėjimo kodas nurodo klaidą.

Su bash galite gauti paskutinės komandos išėjimo iš $ kodą? kintamasis. žuvyje naudokite $ statuso kintamąjį. stderr galite prijungti prie laikino failo ir išspausdinti tik tada, kai atsiranda klaida. Pavyzdžiui( žuvis ):

Taip pat galite naudoti kai kuriuos sparčiuosius klavišus, jei nesate grandinės komandų:

Arba:

Taip pat galite užpildyti stdout į tą patį buferį, naudodami 2 & gt; 1 & gt;/tmp/ išvesties buferis .

( Pastaba: Aš iš tikrųjų nežinau žuvų , todėl aš pritaikiau koncepciją į tai, ką galiu rasti savo dokumentuose. Sinteksė gali būti šiek tiek neteisinga. Taip pat galite naudoti mktemp , kad sukurtumėte unikalų laikinąfailas paleiskite jį ir įrašykite failo pavadinimą kintamojoje).

Jei norite paleisti visą dalyką į lukšto foną, kurį tuo pačiu metu naudojate ir interaktyviai, tada jums geriau rašyti scenarijų, kuris tvarkysišvesties slėpimas ir paleidimas scenarijų fone naudojant standartines technologijas( žuvis ).Pavyzdžiui, /.config/fish/ config.fish gali įdėti kažką panašaus į tokią funkciją: :

Skambinti su paleidžiamu tyrimu ir valdymu( kur pabaigos ir sukelia fone)

Atkreipkite dėmesį, kad tai sugrąžins pradinį išvesties kodą ir sugadins tiek stdout , tiek stderr .Galite tinkinti, jei reikia.

( 1) Nėra garantijos, kad klaidų išvedimas nebus rodomas stdout , kai kurios programos iškraus visą produkciją ten!

( 2) Deja, tai dar ne visada. Išėjimo kodas yra visiškai kontroliuojamas programos, o kai kurie nurodo tam tikras sėkmės sąlygas su nuliniais išėjimais. Vėlgi, patikrinkite vadovą.

Vykdydami Maximillian Laumeister atsakymą:

Unix komunalinės paslaugos siunčia bendrus pranešimus į stdout ir klaidų pranešimus stderr , taigi, jei mes tik norime matyti klaidų pranešimus, pakanka, kad būtų užkertamas kelias stdout , kadtik stderr išeina į konsolę.

Tai galima padaryti( tiek bash , tiek žuvies ) - tai pridėti & gt;/dev/ null komandai.Šie vamzdžiai stdout į nieką, bet stderr ( su savo klaidos pranešimais) vis dar patenka į konsolę.

Pavyzdžiui:

Komanda echo 1 & gt;/dev/ null nieko nenuspausdina, nes normalus stdout išėjimas yra slopinamas, ir nieko nebuvo parašyta stderr .

Komanda man doesnotexist & gt;/dev/ null spausdina klaidos pranešimą, nes žmogus rašo klaidos pranešimą stderr .

Ar turite ką nors įtraukti į paaiškinimą?Garsas išjungtas komentaruose. Norite skaityti daugiau atsakymų iš kitų "Tech-savvy Stack Exchange" vartotojų?Patikrinkite visą diskusijų temą čia.