19Aug

Hvordan kjører du en kommando i bakgrunnen uten utdata med mindre det er en feil?

click fraud protection

Hvis du er en travel person, så er det siste du trenger å være plaget med mange "ubrukelige" varsler, så hvordan stopper du ting? Dagens SuperUser Q & A-innlegg har noen gode svar for å hjelpe en leser til å stille ned mengden av produksjonen.

Dagens Spørsmål &Svar-sesjon kommer til oss med høflighet av SuperUser-en underavdeling av Stack Exchange, en fellesskapsdrevet gruppering av Q & A-nettsteder.

Spørsmålet

SuperUser-leser Xster ønsker å vite hvordan man kjører en kommando i bakgrunnen uten utdata med mindre det er en feil:

Hvordan undertrykker du en kommandos utgang, men viser den hvis kommandoen avsluttes med en feil?

Hvordan får du en kommando til å kjøre i bakgrunnen uten utdata med mindre det er en feil?

Svaret

SuperUser-bidragsytere Bob og Maximillian Laumeister har svaret for oss. Først opp, Bob:

Dessverre er antagelsen om at stderr bare brukes til feilutgang, ikke alltid korrekt. Snarere stderr brukes ofte for alle interaktive utdata og diagnostikk( dvs. utdata beregnet for brukeren å lese i en interaktiv spørring).

instagram viewer
( 1) wget og dd er kjente eksempler.

Enkelte kommandoer vil gi et flagg( dvs. -quiet eller -silent ) for å undertrykke ikke-feilutgang. Les deres mannsider for å se om det finnes en.

En annen konvensjon som holder oftere er utgangskode , et program returnerer en exitkode når den går ut. Typisk ( 2) indikerer en utgangskode for 0 suksess, og enhver annen utgangskode indikerer en feil.

Med bash , kan du få utgangskoden til den siste kommandoen fra $? variabel. I fisk , bruk $ status variabelen. Du kan røre stderr til en midlertidig fil og bare skrive ut den hvis det oppstår en feil. For eksempel( fisk ):

Du kan også bruke noen snarveier hvis du ikke kjeder kommandoer:

Eller:

Du kan også rør stdout til samme buffer ved å bruke 2 & gt; 1 & gt;/tmp/ utgangsbuffer .

( Note: Jeg kjenner egentlig ikke fisk , så jeg tilpasser konseptet til det jeg finner i dokumentasjonen. Syntaxen kan være litt feil. Du kan også bruke mktemp for å generere en unik midlertidigfil. Kjør det og ta opp filnavnet i en variabel.)

Hvis du trenger å kjøre alt i bakgrunnen av et skall som du også bruker interaktivt på samme tid, så er det bedre å skrive et skript for å håndtereoutput-gjemmer og kjører det skriptet i bakgrunnen med standardteknikkene( fisk ).Heck, du kan sette noe som følgende funksjon i ~ /.config/fish/ config.fish :

Samtal med run-silent somecommand &( der den etterfølgende & får det til å kjøre i bakgrunnen)

Vær oppmerksom på at dette vil sluke den opprinnelige utgangskoden, og vil dumpe både stdout og stderr i tilfelle feil. Du kan tilpasse det etter behov.

( 1) Det er ingen garanti for at feilutgang ikke vises på etter , noen programmer vil dumpe all utgang der!

( 2) Dessverre er dette fortsatt ikke alltid tilfelle. Utgangskoden er helt kontrollert av programmet, og noen vil indikere noen suksessforhold med nullutganger. Igjen, sjekk håndboken.

Etterfulgt av svaret fra Maximillian Laumeister:

Unix utilities sender generelle meldinger til stdout , og ​​feilmeldinger til stderr , så hvis vi bare vil se feilmeldinger, vil det være tilstrekkelig å undertrykke stdout slik atbare stderr får utgang til konsollen.

Måten å gjøre dette( i både bash og fisk ) er å legge til & gt;/dev/ null til kommandoen. Dette rør utgjør i ingenting, men stderr ( med feilmeldingene dine) kommer frem til konsollen.

Så for eksempel:

Kommandoen echo 1 & gt;/dev/ null skriver ingenting, fordi den vanlige stdout -utgangen undertrykkes, og ingenting ble skrevet til stderr .

Kommandoen mann gjør notateksistikk & gt;/dev/ null skriver ut en feilmelding, fordi mann skriver sin feilmelding til stderr .

Har du noe å legge til forklaringen? Lyder av i kommentarene. Vil du lese flere svar fra andre tech-savvy Stack Exchange-brukere? Sjekk ut hele diskusjonstråden her.