Hvordan kjører du en kommando i bakgrunnen uten utdata med mindre det er en feil?
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 vil 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 avslutter 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 antar det at stderr er bare brukt for feilutgang er ikke alltid korrekt. Heller, stderr brukes ofte for alle interaktive utdata og diagnostikk (dvs. utdata beregnet for brukeren å lese i en interaktiv spørring).(1) wget og dd er velkjente eksempler.
Noen kommandoer vil gi et flagg (dvs.. -stille eller -stille) 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 utgangskode når den går ut. Typisk(2), en utgangskode for 0 indikerer suksess, og enhver annen utgangskode indikerer en feil.
Med bash, Du kan få utgangskoden til den siste kommandoen fra $? variabel. I fisk, bruke $ status variabel. 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øre stdout til samme buffer ved bruk av 2> & 1> / tmp / outputbuffer.
(Merk: Jeg vet egentlig ikke fisk, så jeg tilpasser konseptet til det jeg finner i dokumentasjonen. Syntaxen kan være litt feil. Du kan også bruke mktemp å generere en unik midlertidig fil. Kjør det og ta opp filnavnet i en variabel.)
Hvis du trenger å kjøre hele greia i bakgrunnen av et skall som du også bruker interaktivt på samme tid, så er det bedre å skrive et skript for å håndtere utdata-skjulingen og å kjøre det skriptet i bakgrunnen med standardteknikkene (fisk). Heck, du kan legge inn noe som følgende funksjon i ~ / .Config / fisk / config.fish:
Ring med run-silent somecommand & (der den etterfølgende & får det til å løpe i bakgrunnen)
Merk at dette vil svelge den opprinnelige utgangskoden, og vil dumpe begge deler stdout og stderr i tilfelle feil. Du kan tilpasse det etter behov.
(1) Det er ingen garanti for at feilutgang ikke vises på stdout, Noen programmer vil dumpe all produksjon der!
(2) Dessverre er dette fortsatt ikke alltid tilfelle. Utgangskoden er fullstendig styrt av programmet, og noen vil indikere noen suksessforhold med nullutganger. Igjen, sjekk håndboken.
Etterfulgt av svaret fra Maximillian Laumeister:
Unix-verktøy sender generelle meldinger til stdout, og feilmeldinger til stderr, så hvis vi bare vil se feilmeldinger, vil det være tilstrekkelig å undertrykke stdout så det bare stderr får utgang til konsollen.
Måten å gjøre dette på (i begge bash og fisk) er å legge til > / Dev / null til kommandoen. Dette rørene stdout inn i ingenting, men stderr (med feilmeldingene dine) kommer frem til konsollen.
Så for eksempel:
Kommandoen ekko 1> / dev / null skriver ingenting, fordi det normale stdout Utgangen er undertrykt, og ingenting ble skrevet til stderr.
Kommandoen mann doesnotexist> / 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.