19Aug

Hvordan kører du en kommando i baggrunden uden output, medmindre der er en fejl?

Hvis du er en travl person, så er det sidste, du har brug for, at blive generet af en masse "ubrugelige" anmeldelser, så hvordan stopper du tingene ned? Dagens SuperUser Q & A-indlæg har nogle gode svar, der hjælper en læser til at stoppe mængden af ​​output.

Dagens Spørgsmål &Svar session kommer til os høflighed af SuperUser-en underafdeling af Stack Exchange, en community-drevet gruppe af Q & A-websteder.

Spørgsmål

SuperUser-læser Xster ønsker at vide, hvordan man kører en kommando i baggrunden uden output, medmindre der er en fejl:

Hvordan undertrykker du en kommandos output, men viser det, hvis kommandos exitkode koder en fejl?

Hvordan får du en kommando til at køre i baggrunden uden output, medmindre der er en fejl?

Svaret

SuperUser-bidragsydere Bob og Maximillian Laumeister har svaret for os. Først op, Bob:

Desværre er antagelsen om, at stderr kun bruges til fejludgang, ikke altid korrekt. Snarere anvendes stderr ofte til alle interaktive output og diagnostik( dvs. output beregnet til brugeren at læse i en interaktiv prompten).

( 1) wget og dd er velkendte eksempler.

Nogle kommandoer vil give et flag( dvs. -quiet eller -silent ) for at undertrykke ikke-fejl output. Læs deres mandsider for at se, om der findes en.

En anden konvention, der besidder oftere, er exit kode , et program returnerer en exit kode, når den udgår. Typisk ( 2) indikerer en exitkode for 0 succes, og enhver anden exitkode angiver en fejl.

Med bash kan du få exitkode fra den sidste kommando fra $? variabel. I fisk skal du bruge $ status variabel. Du kan rør stderr til en midlertidig fil og udskrive det kun, hvis der opstår en fejl. For eksempel( fisk ):

Du kan også bruge nogle genveje, hvis du ikke kæder kommandoer:

Eller:

Du kan også rør stdout til den samme buffer ved at bruge 2 & gt; 1 & gt;/tmp/ outputbuffer .

( Bemærk: Jeg ved faktisk ikke fisk , så jeg tilpasser konceptet til det, jeg kan finde i dokumentationen. Syntaxen kan være lidt forkert. Du kan også bruge mktemp til at generere en unik midlertidigfil. Kør det og optag filnavnet i en variabel.)

Hvis du skal køre det hele i baggrunden af ​​en shell, som du også bruger interaktivt på samme tid, så er du bedre til at skrive et script til at håndtereoutput-skjuler og kører det script i baggrunden med standardteknikkerne( fisk ).Heck, du kan sætte noget som følgende funktion i ~ /.config/fish/ config.fish :

Ring med run-silent somecommand &( hvor den efterfølgende & får det til at køre i baggrunden)

Bemærk at dette vil sluge den oprindelige exitkode og vil dumpe både stdout og stderr i tilfælde af en fejl. Du kan tilpasse det efter behov.

( 1) Der er ingen garanti for, at fejl output ikke vises på stdout , nogle programmer vil dump alle output der!

( 2) Desværre er det stadig ikke altid tilfældet. Afgangskoden styres fuldstændigt af programmet, og nogle vil indikere nogle succesbetingelser med ikke-nul-udgange. Igen skal du kontrollere manualen.

Efterfulgt af svaret fra Maximillian Laumeister:

Unix-hjælpeprogrammer sender generelle beskeder til stdout og fejlmeddelelser til stderr , så hvis vi kun vil se fejlmeddelelser, vil det være tilstrækkeligt at undertrykke stdout , såkun stderr får output til konsollen.

Måden at gøre dette på( i både bash og fisk ) skal tilføjes & gt;/dev/ null til kommandoen. Dette rør stiger til intet, men stderr ( med dine fejlmeddelelser) kommer stadig igennem til konsollen.

Så for eksempel:

Kommandoen echo 1 & gt;/dev/ null udskriver intet, fordi den normale stdout -udgang undertrykkes, og der er ikke skrevet noget til stderr .

Kommandoen mand doesnotexist & gt;/dev/ null udskriver en fejlmeddelelse, fordi mand skriver sin fejlmeddelelse til stderr .

Har du noget at tilføje til forklaringen? Lyde af i kommentarerne. Vil du læse flere svar fra andre tech-savvy Stack Exchange brugere? Tjek den fulde diskussionstråd her.