Kako pokrenuti naredbu u pozadini bez izlaza osim ako ne postoji pogreška?
Ako ste zauzeta osoba, onda je posljednja stvar koja vam je potrebna da vas smeta ogromna količina 'beskorisnih' obavijesti, pa kako onda utišati stvari? Današnja postova za pitanja i odgovore SuperUser imaju neke izvrsne odgovore kako bi čitatelj mogao umanjiti količinu izlaza.
Današnja sesija pitanja i odgovora dolazi nam ljubaznošću SuperUser-a, podjele Stack Exchangea, grupiranja web-lokacija za pitanja i odgovore u zajednici.
Pitanje
Čitač SuperUser Xster želi znati kako pokrenuti naredbu u pozadini bez izlaza ako ne dođe do pogreške:
Kako potiskujete izlaz naredbe, ali ga prikažite ako naredbeni izlazni kodovi imaju grešku?
Kako dobiti naredbu za pokretanje u pozadini bez izlaza ako ne postoji pogreška?
Odgovor
SuperUser suradnici Bob i Maximillian Laumeister imaju odgovor za nas. Prvo, Bob:
Nažalost, pretpostavka da stderr koristi se samo za izlaz pogrešaka nije uvijek točna. radije, stderr često se koristi za bilo koji interaktivni izlaz i dijagnostiku (tj. izlaz namijenjen korisniku da čita u interaktivnom pozivu).(1) wget i dd su dobro poznati primjeri.
Neke naredbe će dati zastavicu (tj. -miran ili -nijem) za suzbijanje izlaza bez pogreške. Pročitajte njihove man stranice da biste vidjeli je li postoji.
Još jedna konvencija koja je češća je izlazni kod, program vraća izlazni kod kada izađe. Tipično(2), izlazni kod od 0 označava uspjeh, a bilo koji drugi izlazni kôd ukazuje na pogrešku.
S udariti, možete dobiti izlazni kod zadnje naredbe iz $? promjenjiva. U riba, koristiti status $ promjenjiva. Možeš cijediti stderr privremenu datoteku i ispišite je samo ako dođe do pogreške. Na primjer (riba):
Možete upotrijebiti i neke prečace ako ne ulančavate naredbe:
Ili:
Također možete cijediti stdout u isti međuspremnik pomoću 2> & 1> / tmp / outputbuffer.
(Bilješka: Ja zapravo ne znam riba, stoga prilagođavam koncept onome što mogu naći u njegovoj dokumentaciji. Sintaksa može biti malo pogrešna. Također, možete koristiti mktemp za generiranje jedinstvene privremene datoteke. Pokrenite ga i zabilježite naziv datoteke u varijabli.)
Ako trebate pokrenuti cijelu stvar u pozadini ljuske koju također koristite interaktivno u isto vrijeme, bolje je da napišete skriptu za obradu skrivenog izlaza i pokretanje te skripte u pozadini pomoću standardnih tehnika (riba). Pakao, možete staviti nešto poput sljedeće funkcije u ~ / .Config / ribe / config.fish:
Nazovite s nečujno upravljanje (gdje slijedi & uzrokuje pokretanje u pozadini)
Imajte na umu da će to progutati izvorni izlazni kôd i odložiti će oba stdout i stderr u slučaju kvara. Po potrebi ga možete prilagoditi.
(1) Nema jamstva da se izlaz pogreške neće pojaviti stdout, neki će programi tamo ispisati sav izlaz!
(2) Nažalost, to nije uvijek slučaj. Izlazni kôd je u potpunosti kontroliran programom, a neki će ukazati na neke uvjete uspjeha s izlazima koji nisu jednaki nuli. Ponovno provjerite priručnik.
Slijedi odgovor Maximillian Laumeister:
Unixovi alati šalju opće poruke stdout, i poruke o pogreškama stderr, pa ako želimo vidjeti samo poruke o pogreškama, bit će dovoljno za suzbijanje stdout samo tako stderr dobiva izlaz na konzolu.
Način da to učinite (u oba udariti i riba) treba dodati > / Dev / null naredbi. Ovo cijevi stdout u ništavilo, ali stderr (s porukama o pogreškama) i dalje dolazi do konzole.
Na primjer:
Zapovijed echo 1> / dev / null ne ispisuje ništa, jer je normalno stdout izlaz je potisnut, i ništa nije napisano stderr.
Zapovijed man doesnotexist> / dev / null ispisuje poruku o pogrešci jer čovjek piše poruku o pogrešci stderr.
Imate li što dodati objašnjenju? Zvuk isključen u komentarima. Želite li pročitati više odgovora od drugih tehničkih korisnika Stack Exchangea? Pogledajte cjelokupnu temu za raspravu ovdje.