19Aug

Kuidas käivitada taustal käsu ilma väljundita, kui pole viga?

Kui olete hõivatud inimene, siis on viimane asi, mida vajate, on häiritud tohutu hulga "kasutu" teadetega, siis kuidas teid asju kummitate? Tänane SuperUser Q & postitusel on mõned suurepärased vastused, et aidata lugejal vähendada toodangu mahtu.

Tänane küsimus &Vastuste seanss tuleb meile viisakalt SuperUseriga - Q & A veebisaitide kogukonnapõhise grupi Stack Exchange jagunemisest.

Küsimus

SuperUser-lugeja Xster soovib teada, kuidas taustal käsku käivitada ilma väljundita, välja arvatud juhul, kui on olemas viga:

Kuidas sa käsku väljastavad, aga kas see näitab, kas käskude väljumine kodeerib viga?

Kuidas saad käsku käivitada taustal ilma väljundita, kui pole viga?

Vastused

SuperUseri kaasautoritele Bobile ja Maximillian Laumeisterile on meie jaoks vastus. Esiteks, Bob:

Kahjuks pole eeldus, et stderr kasutatakse ainult viga väljundiks, pole alati õige. Selle asemel kasutatakse sageli stderr mis tahes ja kõigi interaktiivsete väljundite ja diagnostikate jaoks( st väljund, mis on mõeldud kasutaja jaoks interaktiivsel viipusel lugemiseks).

( 1) wget ja dd on tuntud näited.

Mõned käsklused pakuvad mitte-vea väljundi vältimiseks lipp( s.t -kestus või -silent ).Lugege nende manuaalilehti, et näha, kas see on olemas.

Teine sagedasem kokkulepe on väljumiskood , programm tagastab väljumise koodi, kui see väljub. Tüüpiliselt ( 2) , näitab 0 väljumiskood edukust ja kõik muud väljumiskood näitavad vea.

Kasutades bash , saate $ viimase käsu väljumiskoodi? muutuja. kalas kasutage $ status muutujat. stderr saate torule ajutise faili ja trükkida ainult juhul, kui ilmneb tõrge. Näiteks( kala ):

Võite kasutada ka mõningaid otseteid, kui te ei ahelda käsklusi:

Või:

Võite ka stdout torule laadida samasse puhvrisse, kasutades 2 & 1 & gt;/tmp/ väljundbuffer .

( Märkus: Ma tegelikult ei tea kala , nii et ma kohandan seda mõistet, mida ma oma dokumentatsioonis leian. Süntaks võib olla veidi vale. Samuti saate kasutada ainulaadset ajutist generatsiooni mktemp faili. Käivita see ja salvestage failinimi muutuja sees.)

Kui teil on vaja kogu shelli taustal käivitada, mida kasutate samal ajal ka interaktiivselt, siis on sul parem käidelda skriptväljund peidab ja käivitab selle skripti taustal standardsete tehnikatega( kala ).Heck, võite ~ /.config/fish/ konfigur.fish -le lisada

funktsiooni kõne, mille abil saab käivitada vaikne operatsioonisüsteem &( kus tagaajamine ja põhjustab selle töötamist taustal)

Pange tähele, et see neelab algse väljundkoodi ja katkestab tõrke korral nii stdout kui stderr .Saate seda vajadusel kohandada.

( 1) Ei ole mingit garantiid, et viga väljundit ei kuvata stdout -l, mõned programmid lasevad seal kogu väljundi!

( 2) Kahjuks pole see alati nii. Programmi abil kontrollitakse väljumiskoode, millest mõned näitavad mõningaid edukuse tingimusi väljalülitustega, mis ei ole nullid. Jällegi kontrollige käsiraamatut.

Järgneb Maximillian Laumeisteri vastus:

Unixi kommunaalkulud saadavad stdout -ile üldisi sõnumeid ja stderr -i veateateid, nii et kui me tahame näha veateateid, siis piisab stdout summutamisest, nii etainult stderr saadab konsooli välja.

Nii( nii bash kui ka kala ) on lisada & gt;/dev/ null käsule. See torud stdout muutusid tühjaks, kuid stderr ( koos veateadetega) läheb ikka konsooli poole.

Nii näiteks:

Käsk echo 1 & gt;/dev/ null ei prindi midagi, sest tavaline stdout väljund on alla surutud ja midagi ei kirjutatud stderr -le.

Käsk man doesnotexist & gt;/dev/ null prindib veateate, kuna mees kirjutab oma veateate stderr -le.

Kas teil on seletamiseks midagi lisada? Helistage kommentaarides. Kas soovite lugeda rohkem vastuseid teistelt tech-savvy Stack Exchange'i kasutajatelt? Tutvu täieliku arutelu teemaga siit.