19Aug

Wie führst du einen Befehl im Hintergrund ohne Ausgabe aus, es sei denn, es gibt einen Fehler?

click fraud protection

Wenn Sie eine vielbeschäftigte Person sind, ist es das Letzte, was Sie brauchen, sich mit einer Unmenge von "nutzlosen" Benachrichtigungen zu beschäftigen, also wie beruhigen Sie die Dinge? Der heutige SuperUser Q & A Beitrag hat einige gute Antworten, um einem Leser zu helfen, die Menge an Ausgaben zu beruhigen.

Heutige Frage &Die Antwortsitzung kommt dank SuperUser, einer Unterteilung von Stack Exchange, einer Community-gesteuerten Gruppierung von Q & A-Websites, zu uns.

Die Frage

SuperUser reader Xster möchte wissen, wie man einen Befehl im Hintergrund ohne Ausgabe ausführt, es sei denn, es gibt einen Fehler:

Wie unterdrückt man die Ausgabe eines Befehls, aber zeigt sie an, wenn der Befehl einen Fehler meldet?

Wie erhalten Sie einen Befehl, der ohne Ausgabe im Hintergrund ausgeführt wird, es sei denn, es liegt ein Fehler vor?

Die Antwort

SuperUser Mitwirkende Bob und Maximillian Laumeister haben die Antwort für uns. Zuerst, Bob:

Leider ist die Annahme, dass

instagram viewer
stderr nur für die Fehlerausgabe verwendet wird, nicht immer korrekt. Stattdessen wird stderr oft für jegliche interaktive Ausgabe und Diagnose verwendet( d. H. Eine Ausgabe, die für den Benutzer zum Lesen einer interaktiven Aufforderung bestimmt ist).( 1) wget und dd sind bekannte Beispiele.

Einige Befehle bieten ein Flag( d. H. - quiet oder - silent ), um eine Ausgabe ohne Fehler zu unterdrücken. Lies ihre Manpages, um zu sehen, ob es einen gibt.

Eine andere Konvention, die häufiger gilt, ist der -Exit-Code . Ein Programm gibt beim Beenden einen Exit-Code zurück. Normalerweise ( 2) , ein Exit-Code von 0 zeigt Erfolg an, und jeder andere Exit-Code zeigt einen Fehler an.

Mit bash können Sie den Exit-Code des letzten Befehls vom $ bekommen? Variable. Verwenden Sie in Fisch die $ Status Variable. Sie können stderr in eine temporäre Datei leiten und nur bei einem Fehler ausdrucken. Zum Beispiel( Fisch ):

Sie können auch einige Abkürzungen verwenden, wenn Sie Befehle nicht verketten:

Oder:

Sie können Stdout auch mit 2 & gt; & 1 & gt;/tmp/ Ausgabepuffer .

( Anmerkung: Ich kenne Fisch nicht wirklich, also passe ich das Konzept an, was ich in seiner Dokumentation finden kann. Die Syntax könnte etwas falsch sein. Auch können Sie mktemp verwenden, um ein eindeutiges temporäres zu erzeugenFühren Sie es aus und notieren Sie den Dateinamen in einer Variablen.)

Wenn Sie das Ganze im Hintergrund einer Shell ausführen müssen, die Sie auch gleichzeitig interaktiv verwenden, sollten Sie besser ein Skript schreibendie Ausgabe-Verbergen und Ausführen dieses Skript im Hintergrund mit den Standardtechniken( Fisch ).Heck, Sie können etwas wie die folgende Funktion in setzen ~ /.config/fish/ config.fish :

Anruf mit run-silent somecommand &( wobei der nachfolgende und dafür sorgen, dass dieser im Hintergrund läuft)

Beachten Sie, dass dies den ursprünglichen Exit-Code schluckt und sowohl -Standard als auch -Stderr im Falle eines Fehlers ausgibt. Sie können es bei Bedarf anpassen.

( 1) Es gibt keine Garantie, dass die Fehlerausgabe nicht auf dem -Standard erscheint, einige Programme werden dort alle Ausgaben ausgeben!

( 2) Leider ist dies immer noch nicht der Fall. Der Beendigungscode wird vollständig vom Programm gesteuert, und einige geben einige Erfolgsbedingungen mit Nicht-Null-Exits an.Überprüfen Sie erneut das Handbuch.

Gefolgt von der Antwort von Maximillian Laumeister:

Unix-Dienstprogramme senden allgemeine Meldungen an -Standard und Fehlermeldungen an stderr . Wenn wir also nur Fehlermeldungen sehen wollen, reicht es aus, -Standard zu unterdrückenNur stderr wird an die Konsole ausgegeben.

Der Weg( sowohl in bash als auch fish ) besteht darin, & gt;/dev/ null zum Befehl. Diese Rohre stdout ins Nichts, sondern Stderr ( mit Fehlermeldungen) noch an der Konsole kommt durch.

So zum Beispiel:

Der Befehl echo 1 & gt;/dev/ null druckt nichts, weil die normale Ausgabe stdout unterdrückt wird und nichts in stderr geschrieben wurde.

Der Befehl man doesnotexist & gt;/dev/ null eine Fehlermeldung aus, weil Mann seine Fehlermeldung schreibt Stderr .

Haben Sie etwas zur Erklärung hinzuzufügen? Ton in den Kommentaren ab. Möchten Sie mehr Antworten von anderen technisch versierten Stack Exchange Benutzern lesen? Sehen Sie sich den vollständigen Diskussionsfaden hier an.