19Aug

Hoe voer je een commando uit op de achtergrond zonder output, tenzij er een fout is?

click fraud protection

Als je een druk persoon bent, is het laatste wat je nodig hebt last van een enorme hoeveelheid 'nutteloze' meldingen, dus hoe maak je de dingen tot rust? De SuperUser Q & A-post van vandaag biedt geweldige antwoorden om een ​​lezer te helpen de hoeveelheid output te verminderen.

De vraag van vandaag &Antwoord sessie komt naar ons met dank aan SuperUser-een onderverdeling van Stack Exchange, een community-gestuurde groepering van Q & A-websites.

De vraag

SuperUser-lezer Xster wil weten hoe een opdracht op de achtergrond uit te voeren zonder uitvoer, tenzij er een fout is:

Hoe onderdrukt u de uitvoer van een opdracht, maar geeft deze weer als het commando exit een foutmelding geeft?

Hoe krijg je een commando om op de achtergrond uit te voeren zonder output tenzij er een fout is?

Het antwoord

SuperUser-bijdragers Bob en Maximillian Laumeister hebben het antwoord voor ons. Ten eerste, Bob:

Helaas is de aanname dat stderr alleen wordt gebruikt voor foutuitvoer niet altijd correct. Integendeel,

instagram viewer
stderr wordt vaak gebruikt voor elke en alle interactieve uitvoer en diagnostiek( d.w.z. uitvoer bedoeld voor de gebruiker om te lezen in een interactieve aanwijzing).( 1) wget en dd zijn bekende voorbeelden.

Sommige opdrachten zullen een vlag( dat wil zeggen -rust of -silent ) leveren om niet-foutuitvoer te onderdrukken. Lees hun man-pagina's om te zien of er een bestaat.

Een andere conventie die vaker voorkomt is de -exitcode , een programma retourneert een exitcode wanneer deze wordt afgesloten. Typisch ( 2) , een exitcode van 0 geeft succes aan en elke andere exitcode geeft een fout aan.

Met bash , kunt u de afsluitcode van de laatste opdracht van de $ krijgen? -variabele. Gebruik in -vissen de $ -status -variabele. U kunt stderr naar een tijdelijk bestand sturen en het alleen afdrukken als er een fout optreedt. Bijvoorbeeld( fish ):

U kunt ook enkele snelkoppelingen gebruiken als u geen chaining-opdrachten gebruikt:

Of:

U kunt ook stdout naar dezelfde buffer pipen met behulp van 2 & gt; & 1 & gt;/tmp/ outputbuffer .

( ) Opmerking: Ik ken vis niet, dus ik pas het concept aan aan wat ik kan vinden in de documentatie. De syntaxis kan enigszins verkeerd zijn. Ook kunt u mktemp gebruiken om een ​​unieke tijdelijkebestand. Voer het uit en noteer de bestandsnaam in een variabele.)

Als u het hele ding op de achtergrond van een shell moet uitvoeren die u ook op hetzelfde moment interactief gebruikt, dan kunt u beter een script schrijven om te verwerkende uitvoer verbergt en voert dat script op de achtergrond uit met de standaardtechnieken( vis ).Je kunt zoiets als de volgende functie plaatsen in ~ /.config/fish/ config.fish :

Oproep met run-silent somecommand &( waarbij de trailing & ervoor zorgt dat het op de achtergrond wordt uitgevoerd)

Merk op dat dit de oorspronkelijke afsluitcode zal inslikken en zowel stdout als stderr zal dumpen in het geval van een fout. U kunt het indien nodig aanpassen.

( 1) Er is geen garantie dat de foutuitvoer niet verschijnt op stdout , sommige programma's zullen daar alle uitvoer dumpen!

( 2) Helaas is dit nog steeds niet altijd het geval. De exitcode wordt volledig beheerd door het programma en sommige zullen enkele succesvoorwaarden aangeven met niet-nul-uitgangen. Nogmaals, bekijk de handleiding.

Gevolgd door het antwoord van Maximillian Laumeister:

Unix-hulpprogramma's sturen algemene berichten naar stdout en foutmeldingen naar stderr , dus als we alleen foutmeldingen willen zien, dan is het voldoende om stdout te onderdrukken zodatalleen stderr wordt uitgevoerd naar de console.

De manier om dit te doen( in zowel bash als vis ) is om & gt;/dev/ null voor het commando. Dit pijpt naar in het niets, maar stderr ( met je foutmeldingen) komt nog steeds door naar de console.

Dus bijvoorbeeld:

Het commando echo 1 & gt;/dev/ null drukt niets af, omdat de normale -stdout -uitvoer wordt onderdrukt en niets is geschreven naar stderr .

Het commando man doesnotexist & gt;/dev/ null drukt een foutmelding af, omdat man zijn foutmelding schrijft naar stderr .

Heeft u iets toe te voegen aan de uitleg? Geluid uit in de reacties. Wilt u meer antwoorden van andere technisch onderlegde Stack Exchange-gebruikers lezen? Bekijk de volledige discussiethread hier.