19Aug

Kako pokrenuti naredbu u pozadini bez izlaza ako nije došlo do pogreške?

click fraud protection

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.

instagram viewer

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.