19Aug
Ako ste zaposlena osoba, zadnja stvar koju trebate je da se smeta velikom količinom "beskorisnih" obavijesti, pa kako ćete tihi stvari? Danas SuperUser Q & A post ima neke odlične odgovore koji pomažu čitatelju da utišava iznos izlaza.
Današnje pitanje &Sesija odgovora nam dolazi zahvaljujući SuperUseru - podjele Stack Exchange, grupiranjem zajednice Q & A web stranica.
Pitanje
SuperUser čitač Xster želi znati kako pokrenuti naredbu u pozadini bez izlaza, osim ako postoji pogreška:
Kako potiskujete naredbu izlaz, ali pokazati ako naredbe izlazni kodovi pogrešku?
Kako dobivate naredbu za pokretanje u pozadini bez izlaza, osim ako postoji pogreška?
Odgovor
SuperUser suradnici Bob i Maximillian Laumeister imaju odgovor za nas. Prvo, Bob:
Nažalost, pretpostavka da se stderr koristi samo za izlazne pogreške nije uvijek točan. Umjesto toga, stderr se često koristi za bilo koji interaktivni izlaz i dijagnostiku( tj. Izlaz namijenjen korisniku za čitanje u interaktivnom promptu).( 1) wget i dd su dobro poznati primjeri.
Neke naredbe će osigurati zastavu( tj. -quiet ili -silentni ) za suzbijanje neizlaznih pogrešaka. Pročitajte njihove stranice s muškarcima kako biste vidjeli postoji li neki.
Još jedna konvencija koja češće čuva izlazni kod , program vraća izlazni kôd kada izađe. Tipično ( 2) , izlazni kod 0 označava uspjeh, a bilo koji drugi izlazni kod označava pogrešku.
S bash , možete dobiti izlazni kod zadnje naredbe iz $? varijabla. U ribi , koristite $ status varijablu. Možete staviti stderr u privremenu datoteku i ispisati je samo ako se pojavi pogreška. Na primjer( riba ):
Također možete koristiti neke prečace ako niste komandne naredbe:
Ili:
Također možete cijev stdout na isti tampon pomoću 2 &/tmp/ izlazni nosač .
( ) Napomena: Ne znam ribu , tako da prilagodavam koncept onome što ja mogu naći u svojoj dokumentaciji. Sintaksa može biti malo pogrešna. Ali, možete koristiti mktemp za generiranje jedinstvenog privremenog
Ako trebate pokrenuti cijelu stvar u pozadini ljuske koju također koristite interaktivno u isto vrijeme, onda ste bolje od pisanja skripte za rukovanjeizlaz-skrivanje i pokretanje skripte u pozadini standardnim tehnikama( riba ).Pakao, možete staviti nešto slično sljedećoj funkciji u ~ /.config/fish/ config.fish :
Poziv s pokrenuti-tihi somecommand &( gdje i uzrokuju da se pokreće u pozadini)
Imajte na umu da će to progutati izvorni izlazni kôd i izbaci stdout i stderr u slučaju kvara. Možete ga prilagoditi prema potrebi.
( 1) Nema garancije da se pogreška neće pojaviti na stdout , neki programi će izbrisati sve izlaz tamo!
( 2) Nažalost, to još uvijek nije uvijek slučaj. Izlazni kôd u potpunosti se kontrolira programom, a neke će pokazati neke uvjete uspjeha s nestalim izlazima. Ponovno provjerite priručnik.
Slijedi odgovor Maximillian Laumeister:
Unix komunalije šalju opće poruke stdout i poruke o pogrešci na stderr , pa ako samo želimo vidjeti poruke o pogrešci, tada će biti dovoljno za suzbijanje stdout tako dasamo stderr dobiva izlaz na konzolu.
Način da to učinite( u obje vrste bash i ribe ) treba dodati & gt;/dev/ null na naredbu. Ovo cijevi stdout u ništa, ali stderr ( s vašim porukama o pogrešci) i dalje dolazi do konzole.
Na primjer:
Naredba echo 1 & gt;/dev/ null ne ispisuje ništa, jer je normalna izlazka stdout potisnuta, a ništa nije napisano na stderr .
Naredba čovjek doesnotexist & gt;/dev/ null ispisuje poruku o pogrešci, jer čovjek piše svoju poruku o pogrešci na stderr .
Imate li nešto za objašnjenje? Zvuči u komentarima.Želite li pročitati više odgovora od drugih tehnoloških korisnika Stack Exchangea? Pogledajte ovdje cijelu raspravu.