loader

Wie führen Sie einen Befehl im Hintergrund ohne Ausgabe aus, es sei denn, es liegt ein Fehler vor?

Anonim

Wenn Sie eine vielbeschäftigte Person sind, ist das Letzte, was Sie brauchen, sich mit einer großen Anzahl von "nutzlosen" Benachrichtigungen zu beschäftigen. Wie können Sie die Dinge beruhigen? Der heutige Q & A-Posting-Beitrag von SuperUser enthält einige großartige Antworten, die dem Leser helfen sollen, die Ausgabe zu reduzieren.

Die heutige Question & Answer-Sitzung wird von SuperUser zur Verfügung gestellt - einer Unterteilung von Stack Exchange, einer Community-basierten Gruppierung von Q & A-Websites.

Die Frage

SuperUser reader Xster möchte wissen, wie ein Befehl im Hintergrund ohne Ausgabe ausgeführt wird, es sei denn, es liegt ein Fehler vor:

Wie unterdrücken Sie die Ausgabe eines Befehls, zeigen sie jedoch, wenn der Exit des Befehls einen Fehler codiert?

Wie erhalten Sie einen Befehl, der im Hintergrund ohne Ausgabe 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. Zunächst einmal, Bob:

Leider ist die Annahme, dass stderr nur für die Fehlerausgabe verwendet wird, nicht immer korrekt. Vielmehr wird stderr häufig für alle interaktiven Ausgaben und Diagnosen verwendet (dh Ausgaben, die vom Benutzer in einer interaktiven Eingabeaufforderung gelesen werden sollen). (1) wget und dd sind bekannte Beispiele.

Einige Befehle stellen ein Flag (z. B. -quiet oder -silent ) bereit, um die fehlerfreie Ausgabe zu unterdrücken. Lesen Sie ihre Manpages, um zu sehen, ob eine existiert.

Eine andere Konvention, die häufiger gilt, ist der Exit-Code . Ein Programm gibt einen Exit-Code zurück, wenn es beendet wird. Typischerweise (2) zeigt ein Beendigungscode 0 den Erfolg an, und jeder andere Beendigungscode zeigt einen Fehler an.

Mit bash können Sie den Exit-Code des letzten Befehls vom $? Variable. Verwenden Sie bei Fischen die Variable $ status . Sie können stderr an eine temporäre Datei übergeben und nur dann drucken, wenn ein Fehler auftritt. Zum Beispiel ( Fisch ):

Sie können auch einige Verknüpfungen verwenden, wenn Sie keine Befehle verketten:

Oder:

Sie können stdout auch mit 2> & 1> / tmp / outputbuffer in den gleichen Puffer leiten .

( Hinweis: Ich kenne Fische nicht wirklich, daher passe ich das Konzept an das an, was ich in der Dokumentation finden kann. Die Syntax ist möglicherweise etwas falsch. Sie können auch mktemp verwenden, um eine eindeutige temporäre Datei zu erstellen. Führen Sie sie aus, und notieren Sie die Dateiname in einer Variablen.)

Wenn Sie das Ganze im Hintergrund einer Shell ausführen müssen, die Sie auch gleichzeitig interaktiv verwenden, sollten Sie lieber ein Skript schreiben, das das Ausblenden der Ausgaben behandelt, und dieses Skript im Hintergrund mit den Standardtechniken ausführen ( Fisch ). Heck, Sie können so etwas wie die folgende Funktion in ~ / .config / fish / config.fish einfügen :

Aufruf mit run-silent somecommand & (wobei das Trailing & bewirkt, dass es im Hintergrund ausgeführt wird)

Beachten Sie, dass dadurch der ursprüngliche Exit-Code verschluckt wird, und stdout und stderr im Fehlerfall ausgegeben werden . Sie können es nach Bedarf anpassen.

(1) Es gibt keine Garantie, dass die Fehlerausgabe nicht in stdout angezeigt wird. Einige Programme werden alle Ausgaben dumpen!

(2) Leider ist dies immer noch nicht der Fall. Der Exit-Code wird vollständig vom Programm gesteuert, und einige zeigen einige Erfolgsbedingungen bei Exits, die nicht Null sind. Überprüfen Sie erneut das Handbuch.

Gefolgt von der Antwort von Maximillian Laumeister:

Unix-Dienstprogramme senden allgemeine Meldungen an stdout und Fehlermeldungen an stderr . Wenn Sie also nur Fehlermeldungen sehen möchten, reicht es aus, stdout zu unterdrücken, so dass nur stderr die Ausgabe an die Konsole ausgibt.

Um dies (sowohl in bash als auch in fish ) zu tun, müssen Sie dem Befehl > / dev / null hinzufügen. Dies führt Stdout ins Nichts, aber Stderr (mit Ihren Fehlermeldungen) kommt immer noch zur Konsole.

So zum Beispiel:

Der Befehl echo 1> / dev / null gibt nichts aus, da die normale Ausgabe von stdout unterdrückt wird und nichts in stderr geschrieben wurde .

Der Befehl man ist nicht vorhanden> / dev / null gibt eine Fehlernachricht aus, da man seine Fehlernachricht in stderr schreibt.


Haben Sie der Erklärung etwas hinzuzufügen? Sound off in den Kommentaren. Möchten Sie mehr Antworten von anderen technisch versierten Stack Exchange-Benutzern lesen? Hier geht es zum vollständigen Diskussionsthread.

Tipp Der Redaktion