19Aug

Cum executați o comandă în fundal, fără ieșire, dacă nu există o eroare?

click fraud protection

Dacă sunteți o persoană ocupată, atunci ultimul lucru de care aveți nevoie este să vă deranjați cu o cantitate imensă de notificări "inutile", deci cum vă pot liniști lucrurile? Postul de astăzi SuperUser Q & A are câteva răspunsuri excelente pentru a ajuta cititorul să atenueze cantitatea de ieșire.

Întrebarea de astăzi &Sesiunea de răspuns vine de la amabilitatea SuperUser - o subdiviziune a Stack Exchange, o grupare bazată pe comunitate a site-urilor web Q & A.

Întrebarea

Reader SuperUser Xster dorește să știe cum să execute o comandă în fundal fără ieșire decât dacă există o eroare:

Cum suprimați ieșirea unei comenzi, dar arătați-i dacă ieșirea comenzii codifică o eroare?

Cum obțineți o comandă pentru a rula în fundal fără ieșire decât dacă există o eroare?

Raspunsul Raspunsii

SuperUser Bob si Maximillian Laumeister au raspunsul pentru noi. Primul sus, Bob:

Din păcate, presupunerea că stderr este folosită numai pentru ieșirea de eroare nu este întotdeauna corectă.Mai degrabă,

instagram viewer
stderr este adesea folosit pentru orice și toate interacțiunile de ieșire și diagnostice( adică ieșirea destinată utilizatorului să citească într-un prompt interactiv).( 1) wget și dd sunt exemple binecunoscute.

Unele comenzi vor furniza un steguleț( adică -calitate sau -silent ) pentru a suprima ieșirea non-eroare. Citiți paginile omului pentru a vedea dacă există unul.

O altă convenție care deține mai des este codul de ieșire , un program returnează un cod de iesire la ieșire. De obicei, ( 2) , un cod de ieșire al 0 indică succesul, iar orice alt cod de ieșire indică o eroare.

Cu bash , puteți obține codul de ieșire al ultimei comenzi de la $?Variabila .În pește , utilizați variabila $ .Aveți posibilitatea să conduceți stderr la un fișier temporar și să îl imprimați numai dacă apare o eroare. De exemplu( pește ):

De asemenea, puteți utiliza anumite comenzi rapide dacă nu sunteți comenzi de legare:

Sau:

Puteți, de asemenea, conduce stdout în același buffer folosind 2 & gt; 1 & gt;/tmp/ outputbuffer .

( Notă: Nu știu de fapt pește , așa că eu sunt de adaptare a conceptului la ceea ce pot găsi în documentația sale. Stația poate fi ușor greșit. De asemenea, puteți utiliza mktemp pentru a genera un temporar unicFișierul Runeți-l și înregistrați numele fișierului într-o variabilă.)

Dacă aveți nevoie să rulați totul în fundalul unei cochilii pe care o utilizați, de asemenea, interactiv în același timp, atunci este mai bine să scrieți un script pentru a fi tratatieșirea ascunzând și executând acest script în fundal cu tehnicile standard( pește ).Heck, puteți pune ceva de genul următoarea funcție în ~ /.config/fish/ config.fish :

Apelați cu run-silent somecommand &( unde și determină ca acesta să ruleze în fundal)

Rețineți că acest lucru va înghiți codul original de ieșire și va anula ambele stdout și stderr în cazul unei defecțiuni. Puteți să o personalizați după cum este necesar.

( 1) Nu există nici o garanție că ieșirea de eroare nu va apărea pe stdout , unele programe vor arunca toate output-ul acolo!

( 2) Din păcate, acest lucru nu este întotdeauna cazul. Codul de ieșire este complet controlat de program, iar unele vor indica anumite condiții de succes cu ieșiri non-zero. Din nou, verificați manualul.

Urmat de răspunsul lui Maximillian Laumeister:

Utilitățile Unix trimit mesaje generale către stdout și mesaje de eroare la stderr , deci dacă vrem doar să vedem mesaje de eroare, atunci este suficient să suprimăm stdout astfel încâtnumai stderr ajunge la consola.

Modul de a face acest lucru( în ambele bash și pește ) este de a adăuga & gt;/dev/ null la comanda. Această conductă stdout în neant, dar stderr ( cu mesaje de eroare) încă vine în consola.

De exemplu:

Comanda echo 1 & gt;/dev/ null nu imprimă nimic, deoarece ieșirea normală stdout este suprimată și nimic nu a fost scris în stderr .

Comanda om doesnotexist & gt;/dev/ null imprimă un mesaj de eroare, deoarece om scrie mesajul său de eroare stderr .

Aveți ceva de adăugat la explicație? Sunați în comentarii. Doriți să citiți mai multe răspunsuri de la alți utilizatori de tehnologie Stack Exchange? Check out discuția completă aici.