Wie führen Sie einen Befehl im Hintergrund ohne Ausgabe aus, es sei denn, es liegt ein Fehler vor?
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 dank 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 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 die Annahme, dass stderr Wird nur für Fehlerausgabe verwendet, ist nicht immer korrekt. Lieber, stderr wird häufig für alle interaktiven Ausgaben und Diagnosen verwendet (d. h. Ausgaben, die der Benutzer zum Lesen einer interaktiven Eingabeaufforderung verwenden soll).(1) wget und dd sind bekannte Beispiele.
Einige Befehle stellen eine Markierung bereit (d. H. -ruhig oder -Leise), 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 die Beendigungscode, Ein Programm gibt einen Exit-Code zurück, wenn es beendet wird. Normalerweise(2), ein Exit-Code von 0 zeigt Erfolg an und jeder andere Beendigungscode zeigt einen Fehler an.
Mit bash, Den Beendigungscode des letzten Befehls erhalten Sie von der $? Variable. Im Fisch, benutze die $ status Variable. Du kannst Pfeifen stderr in eine temporäre Datei 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 auch pfeifen stdout zum gleichen Puffer mit 2> & 1> / tmp / outputbuffer.
(Hinweis: Ich weiß es eigentlich nicht Fisch, Daher passe ich das Konzept an das an, was ich in seiner Dokumentation finden kann. Die Syntax ist möglicherweise etwas falsch. Sie können auch verwenden mktemp eine eindeutige temporäre Datei erstellen. Fü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 lieber ein Skript schreiben, das das Ausblenden der Ausgaben behandelt, und dieses Skript im Hintergrund mit den Standardtechniken ausführen (Fisch). Heck, du kannst so etwas wie die folgende Funktion einfügen ~ / .config / fish / config.fish:
Rufen Sie mit an geräuschloser somecommand & (wo der nachlauf & bewirkt, dass es im Hintergrund läuft)
Beachten Sie, dass dadurch der ursprüngliche Exit-Code verschluckt und beide ausgegeben werden stdout und stderr im falle eines ausfalls. Sie können es nach Bedarf anpassen.
(1) Es gibt keine Garantie dafür, dass die Fehlerausgabe nicht angezeigt wird stdout, 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 Nachrichten an stdout, und Fehlermeldungen an stderr, Wenn wir also nur Fehlermeldungen sehen wollen, reicht es aus, diese zu unterdrücken stdout so dass nur stderr erhält die Ausgabe an die Konsole.
Der Weg dies zu tun (in beiden bash und Fisch) ist anzufügen > / dev / null auf den Befehl. Diese Pfeifen stdout ins Nichts, aber stderr (mit Ihren Fehlermeldungen) kommt immer noch zur Konsole durch.
So zum Beispiel:
Der Befehl Echo 1> / dev / null druckt nichts, weil das normal ist stdout Die Ausgabe wird unterdrückt, und es wurde nichts geschrieben stderr.
Der Befehl man doesnotexist> / dev / null gibt eine Fehlermeldung aus, weil Mann schreibt seine Fehlermeldung in stderr.
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.