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

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

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

    De Question & Answer-sessie van vandaag komt tot ons dankzij SuperUser - een onderdeel van Stack Exchange, een gemeenschapsgedreven groep van Q & A-websites.

    De vraag

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

    Hoe onderdruk je de uitvoer van een commando, maar toon hem 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

    Bijdragers van SuperUser Bob en Maximillian Laumeister hebben het antwoord voor ons. Als eerste, Bob:

    Helaas is de veronderstelling dat stderr wordt alleen gebruikt voor foutuitvoer is niet altijd correct. Liever, stderr wordt vaak gebruikt voor elke en alle interactieve uitvoer en diagnostiek (d.w.z. uitvoer bedoeld voor de gebruiker om in een interactieve aanwijzing te lezen).(1) wget en dd zijn bekende voorbeelden.

    Sommige commando's zullen een vlag (d.w.z.. -stil of -stil) 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 exit code, een programma retourneert een afsluitcode wanneer deze wordt afgesloten. Typisch(2), een exitcode van 0 geeft succes aan en elke andere exitcode geeft een fout aan.

    Met bash, je kunt de exit-code van de laatste opdracht van de $? variabel. In vis, gebruik de $-status variabel. Je kunt pijpen stderr naar een tijdelijk bestand en druk het alleen af ​​als er een fout optreedt. Bijvoorbeeld (vis):

    U kunt ook een aantal sneltoetsen gebruiken als u geen opdrachten aan elkaar koppelt:

    Of:

    Je kunt ook pijpen stdout naar dezelfde buffer door te gebruiken 2> & 1> / tmp / outputbuffer.

    (Notitie: Ik weet het eigenlijk niet vis, dus pas ik het concept aan aan wat ik kan vinden in zijn documentatie. De syntaxis kan enigszins verkeerd zijn. Ook kunt u gebruiken mktemp om een ​​uniek tijdelijk bestand te genereren. Voer het uit en noteer de bestandsnaam in een variabele.)

    Als je het hele ding op de achtergrond van een shell moet uitvoeren die je tegelijkertijd interactief gebruikt, dan ben je beter af met het schrijven van een script om de uitvoer te verwerken en dat script op de achtergrond met de standaardtechnieken uit te voeren (vis). Je kunt zoiets als de volgende functie in doen ~ / .Config / vis / config.fish:

    Bellen met run-silent somecommand & (waar de achterstand & zorgt ervoor dat het op de achtergrond draait)

    Merk op dat dit de originele afsluitcode zal inslikken en beide zal dumpen stdout en stderr in het geval van een storing. U kunt het zo nodig aanpassen.

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

    (2) Helaas is dit nog steeds niet altijd het geval. De exit-code wordt volledig gecontroleerd 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 te onderdrukken stdout dus alleen dat stderr wordt uitgevoerd naar de console.

    De manier om dit te doen (in beide bash en vis) is om toe te voegen > / Dev / null naar het commando. Deze pijpen stdout in het niets, maar stderr (met uw foutmeldingen) komt nog steeds door naar de console.

    Dus bijvoorbeeld:

    Het bevel echo 1> / dev / null drukt niets af, omdat het normaal is stdout uitvoer wordt onderdrukt en er wordt niets naar geschreven stderr.

    Het bevel man doesnotexist> / dev / null drukt een foutmelding af, omdat man schrijft zijn foutmelding naar stderr.


    Heb je 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 hier de volledige discussiethread.