Cum executați o comandă în fundal fără ieșire dacă nu există o eroare?
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 să vă atenți lucrurile? Postul de astăzi SuperUser Q & A are câteva răspunsuri excelente pentru a ajuta un cititor 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 web Q & A.
Intrebarea
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 decât dacă există o eroare?
Răspunsul
Utilizatorii SuperUser Bob și Maximillian Laumeister au răspunsul pentru noi. În primul rând, Bob:
Din păcate, presupunerea că stderr este folosit 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 la ieșire. tipic(2), un cod de ieșire din 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 să îl tipăriți 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, conduce stdout la același buffer utilizând 2> & 1> / tmp / outputbuffer.
(Notă: Nu știu de fapt peşte, așadar, adaptez conceptul la ceea ce găsesc în documentația sa. Sintaxa ar putea fi ușor greșită. De asemenea, puteți folosi mktemp pentru a genera un fișier temporar unic. Porniți-l și înregistrați numele fișierului într-o variabilă.)
Dacă trebuie 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 să rulați 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 original 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ă nicio garanție că ieșirea de eroare nu va apărea pe stdout, unele programe vor arunca toate output-urile 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, astfel încât dacă vrem doar 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 conducte 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 la stderr.
Aveți ceva de adăugat la explicație? Sunați în comentariile. Doriți să citiți mai multe răspunsuri de la alți utilizatori de tehnologie Stack Exchange? Check out discuția completă aici.