Dacă sunteți o persoană ocupată, atunci ultimul lucru de care aveți nevoie este să vă deranjați cu o cantitate uriașă de notificări "inutile", așa că cum vă puteți 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.
Sesiunea de întrebări și răspunsuri din ziua de astăzi vine de la amabilitatea SuperUser - o subdiviziune a Stack Exchange, o grupare bazată pe comunitate a site-urilor Q & A.
Cititorul 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 dacă nu există o eroare?
Utilizatorii SuperUser Bob și Maximillian Laumeister au răspunsul pentru noi. În primul rând, Bob:
Din păcate, presupunerea că stderr este utilizat numai pentru ieșirea de eroare nu este întotdeauna corectă. Mai degraba, stderr este adesea folosit pentru orice ieșire interactivă și diagnostice (adică ieșire destinată utilizatorului să citească într-un prompt interactiv).(1) wget și dd sunt exemple binecunoscute.
Unele comenzi vor furniza un steag (adică -Liniște sau -tăcut) 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 cod de ieșire, un program returnează un cod de ieșire când iese. tipic(2), un cod de ieșire de 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 din $? variabil. În peşte, folosește starea $ variabil. Poți conduce stderr la un fișier temporar și îl puteți tipări doar 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, conducte stdout la același buffer utilizând 2> & 1> / tmp / outputbuffer.
(Notă: Nu știu de fapt peşte, așa că adaptez conceptul la ceea ce găsesc în documentația sa. Sintaxa ar putea fi ușor greșită. De asemenea, puteți utiliza mktemp pentru a genera un fișier temporar unic. Porniț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 și în mod interactiv în același timp, atunci este mai bine să scrieți un script care să se ocupe de ascunderea de ieșire și de a rula acest script în fundal cu tehnicile standard (peşte). Heck, poți pune ceva asemănător cu următoarea funcție ~ / .Config / pește / config.fish:
Sunați cu run-silent somecommand & (în cazul în care & face ca acesta să ruleze în fundal)
Rețineți că acest lucru va înghiți codul inițial de ieșire și va anula ambele stdout și stderr în caz de eșec. 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:
Utilitarele Unix trimit mesaje generale la stdout, și mesaje de eroare la stderr, așa că dacă nu vrem să vedem mesaje de eroare, atunci este suficient să suprimăm stdout astfel încât numai stderr iese la consola.
Modul de a face acest lucru (în ambele bash și peşte) este de a adăuga > / Dev / null la comandă. Acest tuburi stdout în nimic, dar stderr (cu mesajele dvs. de eroare) continuă să ajungă la consola.
Deci, de exemplu:
Comanda echo 1> / dev / null nu imprimă nimic, pentru că este normal stdout ieșirea este suprimată și nu a fost scris nimic stderr.
Comanda om doesnotexist> / 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.